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

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

 

jobject classLoader = env->CallObjectMethod(cocos2dClass, getClassLoaderMethod);

 

if(env->ExceptionCheck())

{

env->ExceptionDescribe();

env->ExceptionClear();

LOGD(Exception initClassLoaderForMultiThread classLoader);

break;

}

 

gClassLoader = env->NewGlobalRef(classLoader);

 

jmethodID findClassMethod = env->GetMethodID(classLoaderClass,findClass, (Ljava/lang/String;)Ljava/lang/Class;);

 

 

gFindClassMethod = findClassMethod;

 

if(env->ExceptionCheck())

{

env->ExceptionDescribe();

env->ExceptionClear();

gFindClassMethod = NULL;

gClassLoader = NULL;

LOGD(Exception initClassLoaderForMultiThread findClassMethod);

break;

}

}while(0);

}

然后在 JniHelper::setJavaVM 函数中调用上面的函数。如下所示:

 

void JniHelper::setJavaVM(JavaVM *javaVM)

{

m_psJavaVM = javaVM;

initClassLoaderForMultiThread(); }

 

然后修改 getClassID_ 函数. 添加下面灰色阴影的部分。即在原有的FindClass失败的时候,

用我们新的ClassLoader的方法来查找类。

ret = static_cast(pEnv->CallObjectMethod(gClassLoader, gFindClassMethod, jstrName));

 

 

static jclass getClassID_(constchar *className,JNIEnv *env)

{

JNIEnv *pEnv = env;

jclass ret = 0;

 

do

{

if (! pEnv)

{

if (! getEnv(&pEnv))

{

break;

}

}

 

ret = pEnv->FindClass(className);

 

if (! ret)

{

if(gClassLoader)

{

if(pEnv->ExceptionCheck())

{

pEnv->ExceptionDescribe();

pEnv->ExceptionClear();

}

jstring jstrName = (pEnv)->NewStringUTF(className);

ret = static_cast(pEnv->CallObjectMethod(gClassLoader, gFindClassMethod, jstrName));

if(ret) break;

}

LOGD(Failed to find class of %s, className);

break;

}

} while (0);

 

return ret;

}


然后在你的线程代码中,可以使用JniHelper来调用相应的方法了。

 

JniHelper::getStaticMethodInfo 等方法和本来单线程的就一样了。

 

大功告成了。已经可以透明处理多线程了。

如果你的环境不是cocos2dx,只需要修改将上面添加的部分移到你的环境中就可以了。

唯一的区别,就是将这句

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

中的字符串org/cocos2dx/lib/Cocos2dxRenderer 换成你的环境中肯定存在的java类就可以了。

 

补充线程的资源同步:

如果线程间需要用到java端的资源同步。可以使用 jint MonitorEnter(jobject obj); 和 jint MonitorExit(jobject obj);

类似一个简单的同步锁,在Java中我们这样写

 

synchronized (obj) {
//dosomething

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

推荐热点

  • 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