zoukankan      html  css  js  c++  java
  • 关于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();
    
        }
    

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

  • 相关阅读:
    hdu 5387 Clock (模拟)
    CodeForces 300B Coach (并查集)
    hdu 3342 Legal or Not(拓扑排序)
    hdu 3853 LOOPS(概率DP)
    hdu 3076 ssworld VS DDD(概率dp)
    csu 1120 病毒(LICS 最长公共上升子序列)
    csu 1110 RMQ with Shifts (线段树单点更新)
    poj 1458 Common Subsequence(最大公共子序列)
    poj 2456 Aggressive cows (二分)
    HDU 1869 六度分离(floyd)
  • 原文地址:https://www.cnblogs.com/ZrBlog/p/4382483.html
Copyright © 2011-2022 走看看