我使用 一個 自己寫的 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 ;
}
uj5u.com熱心網友回復:
1.使用了錯誤的回呼方法 CallIntMethod應該改為 CallVoidMethod
2.在回呼函式中 不應該使用 setText 的ui 操作函式, 可能只能在 ui 執行緒有效
3.java 里面的 char 和 c++ 的char 是不對等的 一個是 16位 一個是 8位 應該改為 byte 型別
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/22108.html
標籤:Android
