简析 cocos2d-x Android 调用启动过程

一、启动activtiy

       AndroidManifest.xml里配置了启动activity为AppActivity

     

      

            
                
                
            
        

     而 AppActivity没有做任何事情,只是继承于Cocos2dxActivity,那所有的动作都交与Cocos2dxActivity处理。

二、Cocos2dxActivity OnCreate方法

       按照Activity的生命周期,继续看Cocos2dxActivity的OnCreate方法。其中OnCreate调用了onLoadNativeLibraries,该方法则就是加载我们之前说的生成的so库.而库的名称则是通过 AndroidManifest.xml里定义的,如下面代码片段。

      

  protected void onLoadNativeLibraries() {
        try {
            ApplicationInfo ai = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
            Bundle bundle = ai.metaData;
            String libName = bundle.getString("android.app.lib_name");
            System.loadLibrary(libName);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }



 
        

三、调用libcocos2dcpp的Native 方法

        在Oncreate方法里调用了this.init()方法。在init方法里 this.mGLSurfaceView.setCocos2dxRenderer(new Cocos2dxRenderer());

      

   @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        CocosPlayClient.init(this, false);

        onLoadNativeLibraries();

        sContext = this;
        this.mHandler = new Cocos2dxHandler(this);
        
        Cocos2dxHelper.init(this);
        
        this.mGLContextAttrs = getGLContextAttrs();
        this.init();


    在Cocos2dxRenderer 的onSurfaceCreated我们可以看到首次调用了nativeInit方法。

   @Override
    public void onSurfaceCreated(final GL10 GL10, final EGLConfig EGLConfig) {
        Cocos2dxRenderer.nativeInit(this.mScreenWidth, this.mScreenHeight);
        this.mLastTickInNanoSeconds = System.nanoTime();
        mNativeInitCompleted = true;
    }


四、nativeInit实现部分

       在文件里cocos2d/cocos/platform/android/javaactivity-android.cpp文件里我们可以找到nativeInit的实现部分


JNIEXPORT 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::GLViewImpl::create("Android app");
        glview->setFrameSize(w, h);
        director->setOpenGLView(glview);

        cocos2d::Application::getInstance()->run();
    }
    else
    {
        cocos2d::GL::invalidateStateCache();
        cocos2d::GLProgramCache::getInstance()->reloadDefaultGLPrograms();
        cocos2d::DrawPrimitives::init();
        cocos2d::VolatileTextureMgr::reloadAllTextures();

        cocos2d::EventCustom recreatedEvent(EVENT_RENDERER_RECREATED);
        director->getEventDispatcher()->dispatchEvent(&recreatedEvent);
        director->setGLDefaultValues();
    }
    cocos2d::network::_preloadJavaDownloaderClass();
}



五、开始Class目录下代码执行

       在nativeInit里 cocos2d::Application::getInstance->run();而此步就是获取实例并调用其方法开始执行具体相关动作。对象的实例化则是在如下两处代码里:


   

JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved)
{
    JniHelper::setJavaVM(vm);

    cocos_android_app_init(JniHelper::getEnv());

    return JNI_VERSION_1_4;
}

cocos_android_app_init调用main.cpp的方法:

void cocos_android_app_init (JNIEnv* env) {
    LOGD("cocos_android_app_init");
    AppDelegate *pAppDelegate = new AppDelegate();
}



       





你可能感兴趣的:(cocos2dx)