一、启动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();
}