Java 释放JNI阵列 我在C++中实现回调函数,但是我面临一些漏洞问题。

Java 释放JNI阵列 我在C++中实现回调函数,但是我面临一些漏洞问题。,java,android,c++,callback,java-native-interface,Java,Android,C++,Callback,Java Native Interface,数组创建的实现: jshortArray convertShortArrayToJNI(JNIEnv* env, short* arr, size_t count) { jshortArray retval = env->NewShortArray(count); env->SetShortArrayRegion(retval,0,count,arr); return retval; } 下面是回调调用: short* audio_frame; int size; jo

数组创建的实现:

jshortArray convertShortArrayToJNI(JNIEnv* env, short* arr, size_t count) {
  jshortArray retval = env->NewShortArray(count);
  env->SetShortArrayRegion(retval,0,count,arr);
  return retval;
}
下面是回调调用:

short* audio_frame;
int size;
jobject* callbackObject;
jshortArray array = convertShortArrayToJNI(jenv, audio_frame, size);
LOGI("array %d", array);
jenv->CallVoidMethod(*callbackObject, callbackMI, array);
LOGI("callback called!");
jenv->ReleaseShortArrayElements(array, audio_frame, 0);
经过几次呼叫后,显示以下错误:

12-03 11:12:38.425: W/dalvikvm(894): ReferenceTable overflow (max=512)
12-03 11:12:38.425: W/dalvikvm(894): Last 10 entries in JNI local reference table:
12-03 11:12:38.425: W/dalvikvm(894):   502: 0x44f879b0 cls=[S (100 bytes)
12-03 11:12:38.435: W/dalvikvm(894):   503: 0x44f87a98 cls=[S (100 bytes)
12-03 11:12:38.435: W/dalvikvm(894):   504: 0x44f87b80 cls=[S (100 bytes)
12-03 11:12:38.435: W/dalvikvm(894):   505: 0x44f87c68 cls=[S (100 bytes)
12-03 11:12:38.435: W/dalvikvm(894):   506: 0x44f87d50 cls=[S (100 bytes)
12-03 11:12:38.435: W/dalvikvm(894):   507: 0x44f87e38 cls=[S (100 bytes)
12-03 11:12:38.435: W/dalvikvm(894):   508: 0x44f87f20 cls=[S (100 bytes)
12-03 11:12:38.435: W/dalvikvm(894):   509: 0x44f88008 cls=[S (100 bytes)
12-03 11:12:38.435: W/dalvikvm(894):   510: 0x44f880f0 cls=[S (100 bytes)
12-03 11:12:38.435: W/dalvikvm(894):   511: 0x44f881d8 cls=[S (100 bytes)
12-03 11:12:38.435: W/dalvikvm(894): JNI local reference table summary (512 entries):
12-03 11:12:38.435: W/dalvikvm(894):     1 of Ljava/lang/Class; 164B
12-03 11:12:38.435: W/dalvikvm(894):   511 of [S 100B (511 unique)
12-03 11:12:38.435: W/dalvikvm(894): Memory held directly by tracked refs is 51264 bytes
怎么了?

答案是:

调用
jenv->DeleteLocalRef(数组)解决我的问题

答案是:


调用
jenv->DeleteLocalRef(数组)解决我的问题

对此不完全确定,但尝试删除对ReleaseShortArrayElements的调用。当您调用newshortaray时,该数组现在被放置在垃圾收集内存中。SetShortaryRegion只是将内存从缓冲区复制到GC堆中:释放您(而不是JNI)分配的内存必然会导致问题。将ReleaseShortArrayElements用于GetShortArrayElements。对此不完全确定,但请尝试删除对ReleaseShortArrayElements的调用。当您调用newshortaray时,该数组现在被放置在垃圾收集内存中。SetShortaryRegion只是将内存从缓冲区复制到GC堆中:释放您(而不是JNI)分配的内存必然会导致问题。使用ReleaseShortArrayElements获取ShortArrayElements。