cocos2d-x 中多线程的c/c++代码通过JNI调用java代码
这个文章为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 issueloadClass
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;);
相关新闻>>
- 发表评论
-
- 最新评论 更多>>