在C++代码中,回调Java函数:
void OCDelegate::OnTLSReadEvent(const bolo::BoloBuf* buf) {
int status;
JNIEnv *env;
bool isAttached = false;
status = jniVm->GetEnv((void **) &env, JNI_VERSION_1_6);
if (status < 0) {
status = jniVm->AttachCurrentThread(&env, NULL);
if (status < 0) {
return;
}
isAttached = true;
}
char* charBuf = buf->headPtr();
int length = buf->length();
__android_log_print(ANDROID_LOG_INFO, "@@@@@@@@@@@@@@@@@",
"Jni OnTLSNetworkReturnsData.... on call back ........ the length is : %d", length);
jbyteArray bufArray = env->NewByteArray(length);
if (length > 0) {
/*jbyte* ba = env->GetByteArrayElements(bufArray, JNI_FALSE);
if (NULL != ba) {
memcpy(ba, charBuf, length);
env->ReleaseByteArrayElements(bufArray, ba, 0);
}*/
env->SetByteArrayRegion(bufArray, 0, length, (jbyte*)charBuf);
}
jclass cls = env->GetObjectClass(jniObj);
jmethodID callback = env->GetMethodID(cls, "onTLSReadEvent",
"([B)V");
__android_log_print(ANDROID_LOG_INFO, "@@@@@@@@@@@@@@@@@",
"GetMethodID ok, callback=%p", callback);
env->CallVoidMethod(jniObj, callback, bufArray);
__android_log_print(ANDROID_LOG_INFO, "@@@@@@@@@@@@@@@@@",
"GetMethodID ok, 22222222222222222222");
env->DeleteLocalRef(cls);
env->DeleteLocalRef(bufArray);
__android_log_print(ANDROID_LOG_INFO, "@@@@@@@@@@@@@@@@@",
"GetMethodID ok, 3333333333333333333");
}
C++里面的Log代码均打印!
但是在java代码中。
public void onTLSReadEvent(byte[] array) {
for (int i = 0; i < 3; i++) {
Log.v("@@@@@@@@@@@@@@", " in for.... java get message from C call back" + "1111111111111");
}
Log.v("@@@@@@@@@@@@@@", "java get message from C call back" + "1111111111111");
Log.v("@@@@@@@@@@@@@@", "java get message from C call back" + "$$$$$$$$$$$$$");
Log.v("@@@@@@@@@@@@@@", "java get message from C call back" + "222222222222");
Log.v("@@@@@@@@@@@@@@", "java get message from C call back" + "333333333333333");
// Log.v(tag, "RecvFromTLS:length=" + array.length);
Log.v("@@@@@@@@@@@@@@", "java get message from C call back" + "#############");
出Bug的时候,只打印一句log,且只打印一句:
Log.v("@@@@@@@@@@@@@@", " in for.... java get message from C call back"
正确时的LOG:
02-17 16:47:20.645: I/@@@@@@@@@@@@@@@@@(17650): GetMethodID ok, 22222222222222222222
02-17 16:47:20.645: I/@@@@@@@@@@@@@@@@@(17650): GetMethodID ok, 3333333333333333333
02-17 16:47:20.645: I/@@@@@@@@@@@@@@@@@(17650): Jni OnTLSNetworkReturnsData.... on call back ........ the length is : 116
02-17 16:47:20.645: I/@@@@@@@@@@@@@@@@@(17650): GetMethodID ok, callback=0x6d7e9dd0
02-17 16:47:20.645: V/@@@@@@@@@@@@@@(17650): in for.... java get message from C call back1111111111111
02-17 16:47:20.645: V/@@@@@@@@@@@@@@(17650): in for.... java get message from C call back1111111111111
02-17 16:47:20.645: V/@@@@@@@@@@@@@@(17650): in for.... java get message from C call back1111111111111
02-17 16:47:20.645: V/@@@@@@@@@@@@@@(17650): java get message from C call back1111111111111
02-17 16:47:20.645: V/@@@@@@@@@@@@@@(17650): java get message from C call back$$$$$$$$$$$$$
02-17 16:47:20.645: V/@@@@@@@@@@@@@@(17650): java get message from C call back222222222222
02-17 16:47:20.645: V/@@@@@@@@@@@@@@(17650): java get message from C call back333333333333333
02-17 16:47:20.645: V/@@@@@@@@@@@@@@(17650): java get message from C call back#############
02-17 16:47:20.645: I/jni @@@@@@@ jni .....(17650): Your raw is not null
02-17 16:47:20.645: I/jni @@@@@@@ jni .....(17650): Your param 10101010
(标红部分为java部分log)
当出Bug的时候,会打印一下log:
02-17 17:02:17.192: I/@@@@@@@@@@@@@@@@@(18948): sendToTLS... in the net work modu.... is not null
02-17 17:02:17.472: I/@@@@@@@@@@@@@@@@@(18948): Jni OnTLSNetworkReturnsData.... on call back ........ the length is : 17
02-17 17:02:17.472: I/@@@@@@@@@@@@@@@@@(18948): GetMethodID ok, callback=0x6d7e9dd0
02-17 17:02:17.472: V/@@@@@@@@@@@@@@(18948): in for.... java get message from C call back1111111111111
02-17 17:02:17.472: I/@@@@@@@@@@@@@@@@@(18948): GetMethodID ok, 22222222222222222222
02-17 17:02:17.472: I/@@@@@@@@@@@@@@@@@(18948): GetMethodID ok, 3333333333333333333
在java被回调方法只执行了一行代码,敬请大牛解惑!谢谢!
------解决思路----------------------
简直不可思议。。。。楼主说的出BUG的时候就是指log打印缺失吗?
------解决思路----------------------
看错了,好久没有搞了,我看看啊
------解决思路----------------------
你是不是多次执行结果不同?还是每次都是这样的?
------解决思路----------------------
DeleteLocalRef 去掉试试
------解决思路----------------------
雖然你的代碼沒有貼全,但可以知道你c++代碼有典型的多線程問題
------解决思路----------------------
那就是你开了新线程的问题,JNI 似乎只能在注册的线程下使用对象,如果C++ 开了新线程,那么必须使用全局变量存放你需要callback的对象。另外你需要DetachCurrentThread 新线程。