cocos2d-x_Android应用启动调用过程简析

前端之家收集整理的这篇文章主要介绍了cocos2d-x_Android应用启动调用过程简析前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

调用org.cocos2dx.cpp.AppActivity

AppActivity是位于proj.Android/src下,是开发者类(即开发者自定义的类),继承自org.cocos2dx.lib.Cocos2dxActivity,它没有添加任何代码,纯粹是一个Cocos2dxActivity,也是一个Activity。

AppActivity被调用是因为被配置在AndroidManifest.xml

  1. <application android:label="@string/app_name"
  2. android:icon="@drawable/icon">
  3. <activity android:name="org.cocos2dx.cpp.AppActivity"
  4. android:label="@string/app_name"
  5. android:screenOrientation="landscape"
  6. android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
  7. android:configChanges="orientation">
  8.  
  9. <!-- Tell NativeActivity the name of our .so -->
  10. <Meta-data android:name="android.app.lib_name"
  11. android:value="cocos2dcpp" />
  12.  
  13. <intent-filter>
  14. <action android:name="android.intent.action.MAIN" />
  15. <category android:name="android.intent.category.LAUNCHER" />
  16. </intent-filter>
  17. </activity>
  18. </application>

加载libcocos2dcpp.so

libcocos2dcpp.so在编译后生成到proj.android/libs/armeabi下,从上面代码中可以看到android:value=”cocos2dcpp”这行配置内容,它指示了so的名字。

在AppActivity中加载so的代码如下:

  1. @Override
  2. protected void onCreate(final Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4.  
  5. try {
  6. ApplicationInfo ai = getPackageManager().getApplicationInfo(getPackageName(),PackageManager.GET_Meta_DATA);
  7. Bundle bundle = ai.MetaData;
  8. try {
  9. String libName = bundle.getString("android.app.lib_name");
  10. System.loadLibrary(libName);
  11. } catch (Exception e) {
  12. // ERROR
  13. }
  14. } catch (PackageManager.NameNotFoundException e) {
  15. // ERROR
  16. }
  17.  
  18. sContext = this;
  19. this.mHandler = new Cocos2dxHandler(this);
  20.  
  21. this.init();
  22.  
  23. Cocos2dxHelper.init(this);
  24. }

调用cocos_android_app_init

proj.android/jni/hellocpp/main.cpp中的cocos_android_app_init函数调用

我们看看this.init();后续代码片段:

  1. public void init() {
  2. ...
  3. this.mGLSurfaceView.setCocos2dxRenderer(new Cocos2dxRenderer());
  4. ...
  5. }
  1. @Override
  2. public void onSurfaceCreated(final GL10 pGL10,final EGLConfig pEGLConfig) {
  3. Cocos2dxRenderer.nativeInit(this.mScreenWidth,this.mScreenHeight);
  4. this.mLastTickInNanoSeconds = System.nanoTime();
  5. }

到现在前面都是Java代码,上段中的Cocos2dxRenderer.nativeInit(this.mScreenWidth,this.mScreenHeight);是一句jni调用,java调用c/c++代码

代码在cocos2d/cocos/2d/platform/android/javaactivity.cpp中,如下:

  1. void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv* env,jobject thiz,jint w,jint h)
  2. {
  3. auto director = cocos2d::Director::getInstance();
  4. auto glview = director->getOpenGLView();
  5. if (!glview)
  6. {
  7. glview = cocos2d::GLView::create("Android app");
  8. glview->setFrameSize(w,h);
  9. director->setOpenGLView(glview);
  10.  
  11. //cocos_android_app_init(env,thiz);
  12.  
  13. cocos2d::Application::getInstance()->run();
  14. }
  15. else
  16. {
  17. cocos2d::GL::invalidateStateCache();
  18. cocos2d::ShaderCache::getInstance()->reloadDefaultShaders();
  19. cocos2d::DrawPrimitives::init();
  20. cocos2d::VolatileTextureMgr::reloadAllTextures();
  21.  
  22. cocos2d::EventCustom foregroundEvent(EVENT_COME_TO_FOREGROUND);
  23. director->getEventDispatcher()->dispatchEvent(&foregroundEvent);
  24. director->setGLDefaultValues();
  25. }
  26.  
  27. }
  1. 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};

  2. jintArray glContextAttrsJava = env->NewIntArray(6);

    env->SetIntArrayRegion(glContextAttrsJava,6,tmp);

    return glContextAttrsJava;

    }

我们看到了cocos_android_app_init(env,thiz);这句,这就和main.cpp中的cocos_android_app_init连接上了。

创建AppDelegate

cocos_android_app_init中创建了AppDelegate,后面的事就交给cocos2d-x引擎吧

  1. void cocos_android_app_init (JNIEnv* env,jobject thiz) {
  2. LOGD("cocos_android_app_init");
  3. AppDelegate *pAppDelegate = new AppDelegate();
  4. }
  5.  
  6.  
  7.  
  8.  

来自:http://blog.csdn.net/zimo2013/article/details/41116837

猜你在找的Cocos2d-x相关文章