jni 回调 java 函数 出错 求助
我使用 一个 自己写的 udp 的so
然后 再定义jni接口 调用 so
在udp 接收到数据 就会调用 recudp,
在recudp里面 再 调用 java 的 onProgressCallBack 函数
红色代码就是出错的地方,就在回调 java 时候出错
在 java 端 onProgressCallBack 的定义如下
public void onProgressCallBack(char[] data)
{
if(data!=null) {
tv.setText(data, 0, data.length);
}
}
jni部分的接口代码如下:
JavaVM *g_VM;
jobject g_obj;
int recudp(char *data, int len)
{
JNIEnv *env;
// int getEnvStat = g_VM->GetEnv(g_VM, (void **) &env,JNI_VERSION_1_6);
int getEnvStat = g_VM->GetEnv((void **) &env,JNI_VERSION_1_6);
if (getEnvStat == JNI_EDETACHED) {
//如果没有, 主动附加到jvm环境中,获取到env
if ( g_VM->AttachCurrentThread(&env, NULL) != 0) {
return -1;
}
}
//通过全局变量g_obj 获取到要回调的类
jclass javaClass = env->GetObjectClass(g_obj);
if (javaClass == 0) {
g_VM->DetachCurrentThread();
return -2;
}
//找到需要调用的方法ID
jmethodID javaCallback = env->GetMethodID(javaClass,
"onProgressCallBack", "([C)V");
jcharArray da=env->NewCharArray(len);
env->SetCharArrayRegion(da,0,len,(jchar *)data);
//终于回调了,这个代码 出错
env->CallIntMethod(g_obj,javaCallback,da);
env->DeleteLocalRef(da);
return 0;
}
extern "C" JNIEXPORT void JNICALL
Java_com_example_udph264dec_MainActivity_InitUdp(
JNIEnv *env,
jobject thiz/* this */,
jint port) {
//JavaVM是虚拟机在JNI中的表示,等下再其他线程回调java层需要用到
env->GetJavaVM(&g_VM);
// 生成一个全局引用保留下来,以便回调
g_obj = env->NewGlobalRef(thiz);
InitUDPServer(2048,recudp); //启动 udp 的so 代码,
return ;
}