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

本文介绍了如何在Cocos2d-x的多线程环境中通过JNI调用Java代码,详细解释了如何初始化并使用ClassLoader来避免FindClass的问题,确保在不同线程中正确调用Java方法。
摘要由CSDN通过智能技术生成

转载请注明原地址: http://blog.csdn.net/wu4long/article/details/17757433


这个文章为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;


增加一个新的函数:

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值