关于cocos的跨平台

今天任务是看一部分cocos的源码,了解cocos中java层和c++层的调用关系。这里要明白cocosjavaC++的调用,那么就得先明白几个问题:

 

1、什么是JNI,它解决了什么问题?

2、JNI传入参数的含义?

3、Cocos程序如何在安卓平台跑起来的?

 

JNI Java本地接口,是一种技术手段。能够完成Java 虚拟机 (VM) 内部运行的 Java代码能够与用其它编程语言(如 CC++ 和汇编语言)编写的应用程序和库进行互操作。那么这样一来就解决了

(1)java层调用C/C++代码

(2)Native层调用java代码

 

那么什么是native层呢?

Native可以理解成安卓中的本地框架层。主要是一些本地服务和链接库。这一层是通过C/C++实现的。然后这一层要实现的部分复杂的运算,同时要和上层java实现通信时。就需要刚刚说到jni机制了。当然这一层也还可以和下层硬件驱动的交互。

  

  接下来我们知道jni层也就容易找到在我们自己的demo中,有一个函数是

 

using namespace cocos2d;

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

 

 

 

这个函数的两个参数的类型,按JNI的功能来说,以肯定是java运行环境的本身信息,和java的实例。然后穿进去才可能实现javaC++的调用。那么JNIEnv * 是什么呢?这个的确是细节,可以不去扣。但是可以这么想一想。为什么会出现javaC++的交互困难。不就是因为javac++都有各自的独立内存空间而造成的么。而java是运行在虚拟机上的。虚拟机是一个进程,进程中可以跑很多线程。这个进程中的多个线程都是共享该进程内部信息的。

  所以可以认为第一个参数是和线程相关的一个变量,供C寻址。找到java的运行环境。再加上第二个参数的实例化从而实现交互。再往里深究一下,会发现cocos_android_app_init(JNIEnv * env. Jobject thiz)是在cocos/planform/android中的javaactivity-android.cpp中被调用,实现必要的初始化。而这个javaactivity-android.cpp文件中还有一个函数,直接给出了

auto director = cocos2d::Director::getInstance();

auto glview = director->getOpenGLView();

这里也就是我们用vs开发的时候看到的一句话。导演接管。

但也注意到之前的这个函数只在这出现了一句 new AppDelegate();我们知道在win32下,这里就可以找到程序入口了。所以这个很容易想到了第3个问题。所以cocos在安卓平台上如何实现的?

  首先,可以说cocos是因为各个平台对opengles支持性。在知乎王哲说过这么一句话“Cocos2d-x的跨平台层,很大程度得益于OpenGL ES标准在不同手机平台上都可以运行,即使在wp8上也有Angel ProjectOpenGL ES调用转换到DirectX,所以我们一套OpenGL ES调用可以横跨iOS, Android, WP8三个主要平台”。

  其次安卓上的入口,其实就是上面提及到的

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);

        //cocos_android_app_init(env, thiz);

        cocos2d::Application::getInstance()->run();

    }

而之后是什么怎么进行,也还在研究中。时间不早了,明天继续。

posted on 2015-03-31 23:36  刘展荣  阅读(2084)  评论(0编辑  收藏  举报

导航