JNI中C回调java 比较奇怪Bug(望大牛指点)

傲慢的上校 傲慢的上校 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
在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被回调方法只执行了一行代码,敬请大牛解惑!谢谢!




...全文

相关推荐

评论 16
收藏 已收藏
分享
返回顶部
傲慢的上校
傲慢的上校 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
Android 80,490 成员 91,375 内容