普通android工程入口:
src/org/cocos2dx/cpp_empty_test_diff/MainActivity.java
cocos2d-x入口稍微不同
src/org/cocos2dx/lib/Cocos2dxActivity.java
见 onLoadNativeLibraries 加载NDK编译生成的.so
这时候应用已经启动。
然后利用jni调用c++内容,启动游戏引擎。
具体是:
Cocos2dxActivity.java init -> onCreateView ->
new Cocos2dxGLSurfaceView(this)
Cocos2dxGLSurfaceView extends GLSurfaceView 类似 win32 的 事件回调函数,涉及键盘和touch等
Cocos2dxActivity.java init 中 this.mGLSurfaceView.setCocos2dxRenderer(new Cocos2dxRenderer());
Cocos2dxRenderer implements GLSurfaceView.Renderer
见 其中的 public void onDrawFrame(final GL10 gl) 函数,就是引擎的循环起点
不关心帧率处理,函数就是仅仅调用了 Cocos2dxRenderer.nativeRender();
回到 Cocos2dxActivity.java
private static native void nativeRender();
private static native void nativeInit(final int pWidth, final int pHeight);
这些函数是jni的知识,方法的实现在.so中
分别是:
Java_org_cocos2dx_lib_Cocos2dxRenderer.cpp 中的void JNICALL Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeRender
javaactivity-android.cpp 中的 Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit
JNIEXPORT void JNICALL Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeRender(JNIEnv* env) { cocos2d::Director::getInstance()->mainLoop(); }
可以看到 mainLoop的调用;
void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv* env, jobject thiz, jint w, jint h) { auto glview = director->getOpenGLView(); glview = cocos2d::GLViewImpl::create("Android app"); glview->setFrameSize(w, h); // frame size 的第一手资料 director->setOpenGLView(glview); cocos2d::Application::getInstance()->run(); // 这里的run是空的 }
剩余的流程和 iOS的流程基本一致,请见“cocos2d-x在iOS的接合简单记录”;
对android不太熟悉,仅记录到此