调用org.cocos2dx.cpp.AppActivity
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连接上了。
创建AppDelegate
cocos_android_app_init中创建了AppDelegate,后面的事就交给cocos2d-x引擎吧
void cocos_android_app_init (JNIEnv* env,jobject thiz) { LOGD("cocos_android_app_init"); AppDelegate *pAppDelegate = new AppDelegate(); }
来自:http://blog.csdn.net/zimo2013/article/details/41116837