cocos2d-x 中多线程的c/c++代码通过JNI调用java代码

来源:未知 责任编辑:责任编辑 发表时间:2014-01-06 18:19 点击:

 

这个文章为android multithread in c/c++ to call JNI 的第二篇。

第一篇地址为:http://blog.csdn.net/wu4long/article/details/17756419

上文提到,android的第三种方法,通过ClassLoader object来处理了。

 

  • Cache a reference to the ClassLoader object somewhere handy, and issue loadClass calls directly. This requires some effort.

     

    哪怎样处理呢(This requires some effort) ?

    下面我就以cocos2d-x的环境来具体描述吧。当然不是这个环境的也可以自己来稍微修改下。

    此文方法是参照 http://stackoverflow.com/questions/13263340/findclass-from-any-thread-in-android-jni

    FindClass from any thread in Android JNI

    不过此文章不是针对cocos2d-x来写的。有些地方给出的代码不严谨。

     

     

    ///return true if success. else return false.

    bool your_thread_start_javaVMAttachCurrentThread()

     

    {

     

    JNIEnv* env = NULL;

    if( JniHelper::getJavaVM()->AttachCurrentThread(&env,NULL) < 0) return false;

    return true;

    }

    void your_thread_stop_javaVMDetachCurrentThread()

    {

    JniHelper::getJavaVM()->DetachCurrentThread();

    }

    在线程函数中开始调用 your_thread_start_javaVMAttachCurrentThread(), 线程结束的地方调用 your_thread_stop_javaVMDetachCurrentThread()。 错误处理自己去处理吧。

    上面的两个函数你可以放置在你的认为合适的地方。当然也可以直接放置在JniHelper的类中。自行处理吧。

     

     

    为了可以继续使用JniHelper的方法,透明的规避多线程的问题。我们就直接修改JniHelper.cpp文件。

     

     

    static jobject gClassLoader;

    static jmethodID gFindClassMethod;


    增加一个新的函数:

    static void initClassLoaderForMultiThread()

    {

     

    JNIEnv *env = 0;

    do

    {

    if (! getEnv(&env))

    {

    break;

    }

    jclass cocos2dClass = env->FindClass(org/cocos2dx/lib/Cocos2dxRenderer);

    if(env->ExceptionCheck())

    {

    env->ExceptionDescribe();

    env->ExceptionClear();

    LOGD(ExceptioninitClassLoaderForMultiThread cocos2dClass is exception);

    break;

    }

     

    ///env->FindClass(java/lang/Class);

    jclass classClass = env->GetObjectClass(cocos2dClass);

    if(env->ExceptionCheck())

    {

    env->ExceptionDescribe();

    env->ExceptionClear();

    LOGD(Exception initClassLoaderForMultiThread classClass is exception);

    break;

    }

     

     

    jclass classLoaderClass = env->FindClass(java/lang/ClassLoader);

    if(env->ExceptionCheck())

    {

    env->ExceptionDescribe();

    env->ExceptionClear();

    LOGD(Exception initClassLoaderForMultiThread classLoaderClass);

    break;

    }

     

    jmethodID getClassLoaderMethod = env->GetMethodID(classClass,getClassLoader,

    ()Ljava/lang/ClassLoader;);

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • cocos2d-x学习笔记(19)--label 、label atlas
  • cocos2d-x学习笔记(23)--地图的使用3--CCTMXLayer
  • Cocos2d-x学习(一):HelloWorld
  • cocos2dx在xcode下开发,编译到android上(2)
  • cocos2d 设置屏幕默认方向
  • Cocos2d-x 2.0 之 Actions “三板斧” 之一
  • cocos2d-x学习笔记(22)--地图的使用2(TMX) --Z-Order、AnchorPoi
  • cocos2d-x学习笔记(18)--游戏打包(windows平台)
  • cocos2d-x学习笔记(16)--spritesheet(精灵表单)
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1