AppActivity是位于proj.androID/src下,是开发者类(即开发者自定义的类),继承自org.cocos2dx.lib.Cocos2dxActivity,它没有添加任何代码,纯粹是一个Cocos2dxActivity,也是一个Activity。
AppActivity被调用是因为被配置在AndroIDManifest.xml
<application androID:label="@string/app_name" androID:icon="@drawable/icon"> <activity androID:name="org.cocos2dx.cpp.AppActivity" androID:label="@string/app_name" androID:screenorIEntation="landscape" androID:theme="@androID:style/theme.NoTitlebar.Fullscreen" androID:configChanges="orIEntation"> <!-- Tell NativeActivity the name of our .so --> <Meta-data androID:name="androID.app.lib_name" androID:value="cocos2dcpp" /> <intent-filter> <action androID:name="androID.intent.action.MAIN" /> <category androID:name="androID.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>加载libcocos2dcpp.so
libcocos2dcpp.so在编译后生成到proj.androID/libs/armeabi下,从上面代码中可以看到androID:value=”cocos2dcpp”这行配置内容,它指示了so的名字。
在AppActivity中加载so的代码如下:
@OverrIDe protected voID onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { ApplicationInfo ai = getPackageManager().getApplicationInfo(getPackagename(),PackageManager.GET_Meta_DATA); Bundle bundle = ai.MetaData; try { String libname = bundle.getString("androID.app.lib_name"); System.loadlibrary(libname); } catch (Exception e) { // ERROR } } catch (PackageManager.nameNotFoundException e) { // ERROR } sContext = this; this.mHandler = new Cocos2dxHandler(this); this.init(); Cocos2dxHelper.init(this); }调用cocos_androID_app_init
proj.androID/jni/hellocpp/main.cpp中的cocos_androID_app_init函数被调用。
我们看看this.init();后续代码片段:
public voID init() { ... this.mGLSurfaceVIEw.setCocos2dxRenderer(new Cocos2dxRenderer()); ... }
@OverrIDe public voID onSurfaceCreated(final GL10 pGL10,final EGLConfig pEGLConfig) { Cocos2dxRenderer.nativeInit(this.mScreenWIDth,this.mScreenHeight); this.mLastTickInNanoSeconds = System.nanoTime(); }
到现在前面都是java代码,上段中的Cocos2dxRenderer.nativeInit(this.mScreenWIDth,this.mScreenHeight);是一句jni调用,java调用c/c++代码。
其代码在cocos2d/cocos/2d/platform/androID/javaactivity.cpp中,如下:
voID Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(jnienv* env,jobject thiz,jint w,jint h){ auto director = cocos2d::Director::getInstance(); auto glvIEw = director->getopenGLVIEw(); if (!glvIEw) { glvIEw = cocos2d::GLVIEw::create("AndroID app"); glvIEw->setFrameSize(w,h); director->setopenGLVIEw(glvIEw); //cocos_androID_app_init(env,thiz); cocos2d::Application::getInstance()->run(); } else { cocos2d::GL::invalIDateStateCache(); cocos2d::shadercache::getInstance()->reloadDefaultShaders(); cocos2d::DrawPrimitives::init(); cocos2d::VolatileTextureMgr::reloadAllTextures(); cocos2d::EventCustom foregroundEvent(EVENT_COME_TO_FOREGROUND); director->getEventdispatcher()->dispatchEvent(&foregroundEvent); director->setGLDefaultValues(); }}
jintArray Java_org_cocos2dx_lib_Cocos2dxActivity_getGLContextAttrs(jnienv* env,jobject thiz)
{
cocos_androID_app_init(env,thiz);
cocos2d::Application::getInstance()->initGLContextAttrs();
GLContextAttrs _glContextAttrs = GLVIEw::getGLContextAttrs();
int tmp[6] = {_glContextAttrs.redBits,_glContextAttrs.greenBits,_glContextAttrs.blueBits,
_glContextAttrs.AlphaBits,_glContextAttrs.depthBits,_glContextAttrs.stencilBits};
jintArray glContextAttrsJava = env->NewIntArray(6);
env->SetIntArrayRegion(glContextAttrsJava,6,tmp);
return glContextAttrsJava;
}
我们看到了cocos_androID_app_init(env,thiz);这句,这就和main.cpp中的cocos_androID_app_init连接上了。
创建AppDelegatecocos_androID_app_init中创建了AppDelegate,后面的事就交给cocos2d-x引擎吧
voID cocos_androID_app_init (jnienv* env,jobject thiz) { LOGD("cocos_androID_app_init"); AppDelegate *pAppDelegate = new AppDelegate();}总结
以上是内存溢出为你收集整理的cocos2d-x_Android应用启动调用过程简析全部内容,希望文章能够帮你解决cocos2d-x_Android应用启动调用过程简析所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)