cocos2d-x在android的接合简单记录

普通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不太熟悉,仅记录到此

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。