java 与jni线程_jni c++从子线程调用java

比如 聊天服务器 是异步的,在子线程返回结果,如何通知java.

在初始化时,把jobject mthedid  save下来,注意保存是要NewGlobalRef(minfo.classID);这样作

用到了cocos2d-x的jnihelper文件

jint JNI_OnLoad(JavaVM *vm, void *reserved)

{

JniHelper::setJavaVM(vm);

g_jvm=vm;

return JNI_VERSION_1_4;

}保存 JavaVM

extern JavaVM *g_jvm;

jclass g_class;

jmethodIDg_mid;

void callinit() {

JniMethodInfominfo;

bool isHave = false;

isHave = JniHelper::getStaticMethodInfo(minfo,

"com/buniess/bmbuniess/service/CommMsgService","handlerSendMsg",

"(ILjava/lang/String;)V");

if (isHave) {

g_mid=minfo.methodID;

g_class = minfo.env->NewGlobalRef(minfo.classID);

}

}

在子线程返回时调用

void callJava(int MSG, std::string str) {

JNIEnv **env;

jclass cls;

jmethodIDmid;

if (g_jvm->AttachCurrentThread(env, 0) < 0) {

LOGD("%s: AttachCurrentThread() failed", __FUNCTION__);

}

mid = (*env)->GetStaticMethodID(g_class, "handlerSendMsg",

"(ILjava/lang/String;)V");

if (mid == NULL) {

LOGD("GetMethodID() Error.....");

goto error;

}

jstring jstr;

jstr= JniHelper::string2jstring(str);

(*env)->CallStaticVoidMethod(g_class, g_mid, MSG, jstr);

error: if (g_jvm->DetachCurrentThread() != JNI_OK) {

LOGD("%s: DetachCurrentThread() failed", __FUNCTION__);

}

}

这样就可以完成c++异步和java通信了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值