JNI中C回调java 比较奇怪Bug(望大牛指点)
在C++代码中,回调Java函数:
C++里面的Log代码均打印!
但是在java代码中。
出Bug的时候,只打印一句log,且只打印一句:
正确时的LOG:
(标红部分为java部分log)
当出Bug的时候,会打印一下log:
在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被回调方法只执行了一行代码,敬请大牛解惑!谢谢!
...全文
相关推荐
JNI回调函数,java和c方法相互调用
标题“JNI回调函数,java和c方法相互调用”涉及到的核心概念是Java如何通过JNI调用C/C++的函数,以及C/C++如何反过来调用Java的方法,即所谓的“回调”。1.
JNI实现回调及JNI开启线程
JNI在很多场景下都是必要的,比如当需要利用C/C++库来提高性能,或者实现与硬件设备的直接通信时。本示例中,我们将深入探讨如何使用JNI实现回调机制以及在JNI中开启线程。1.
JNI调用C++代码和C++层回调java层 demo
JNI在许多场景下都很有用,比如利用现有的C/C++库、优化性能敏感的代码段或者实现操作系统特定的功能。本教程将详细介绍如何使用JNI来调用C++代码,并且展示C++层如何回调Java层的方法。
JNI调用及回调就(Java&C) 源码
JNI在很多场景下都是必要的,比如当Java需要利用特定的系统功能,或者需要与已有的C/C++库集成时。在这个场景中,JNI被用来实现Java程序对摄像头的控制,以及处理来自C代码的回调。
JNI 回调函数 Callback
**传递接口实例**:在C/C++代码中,通过JNI接口将Java层的接口实例传递到C/C++环境。3. **保存回调信息**:在C/C++环境中,保存Java接口实例的引用,以便后续回调使用。4.


