jni 回调 java 函数 出错 求助

Jacky_Lu 2020-07-06 11:27:07
我使用 一个 自己写的 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 ;
}
...全文
576 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jacky_Lu 2020-07-06
  • 打赏
  • 举报
回复
1.使用了错误的回调方法 CallIntMethod 应该改为 CallVoidMethod 2.在回调函数中 不应该使用 setText 的ui 操作函数, 可能只能在 ui 线程有效 3.java 里面的 char 和 c++ 的char 是不对等的 一个是 16位 一个是 8位 应该改为 byte 类型

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧