Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我是否需要发布我修改并返回的JNI阵列?_Java_Android_Java Native Interface - Fatal编程技术网

Java 我是否需要发布我修改并返回的JNI阵列?

Java 我是否需要发布我修改并返回的JNI阵列?,java,android,java-native-interface,Java,Android,Java Native Interface,我对JNI有点生疏,在我测试的一款手机上,我遇到了关于ReferenceTable overflow的错误。我理解这与不在本机代码中发布JNI/Java项有关 我认为我不需要发布任何东西,因为我使用给定的jfloatarray,替换它的值,然后再次返回原始的JNI对象。我认为这将使JNI释放对象本身,因为它只是将其取回 JNI代码: extern "C" JNIEXPORT jfloatArray JNICALL Java_methodname( JNIEnv *env, job

我对JNI有点生疏,在我测试的一款手机上,我遇到了关于
ReferenceTable overflow
的错误。我理解这与不在本机代码中发布JNI/Java项有关

我认为我不需要发布任何东西,因为我使用给定的
jfloatarray
,替换它的值,然后再次返回原始的JNI对象。我认为这将使JNI释放对象本身,因为它只是将其取回

JNI代码:

extern "C"
JNIEXPORT jfloatArray JNICALL Java_methodname(
        JNIEnv *env, jobject thiz, jfloatArray data)
{
float* nativeValues = (float *)env->GetFloatArrayElements(data, 0);
doSomething(nativeValues);//overwrite the values with new values
return data;
}
JNI错误(Android 2.3):


我该怎么办?将数据值复制到一个新的
float*
并用它创建一个新的
jfloatarray

您需要释放数组元素,因为当您通过
GetFloatArrayElements(…)
函数获取元素时,JVM将其标记为“在本机代码中使用”。 为此调用
ReleaseFloatArrayElements()
。 查看详情:

这是否仍然允许我返回
数据
?主要思想是:您应该通知JVM您已经开始使用数组,如果需要,它可以使用GC释放它。您可以使用
模式
参数指定发布类型:0-复制回内容并释放elems缓冲区JNI\u提交-复制回内容但不释放elems缓冲区JNI\u中止-释放缓冲区而不复制回可能的更改
11-28 15:00:58.069: W/dalvikvm(833): ReferenceTable overflow (max=1024)
11-28 15:00:58.069: W/dalvikvm(833): Last 10 entries in JNI pinned array reference table:
11-28 15:00:58.069: W/dalvikvm(833):  1014: 0x405f3750 cls=[F (20 bytes)
11-28 15:00:58.069: W/dalvikvm(833):  1015: 0x405f37b0 cls=[F (20 bytes)
11-28 15:00:58.069: W/dalvikvm(833):  1016: 0x405f3810 cls=[F (20 bytes)
11-28 15:00:58.069: W/dalvikvm(833):  1017: 0x405f3870 cls=[F (20 bytes)
11-28 15:00:58.069: W/dalvikvm(833):  1018: 0x405f38d0 cls=[F (20 bytes)
11-28 15:00:58.069: W/dalvikvm(833):  1019: 0x405f3930 cls=[F (20 bytes)
11-28 15:00:58.069: W/dalvikvm(833):  1020: 0x405f3990 cls=[F (20 bytes)
11-28 15:00:58.069: W/dalvikvm(833):  1021: 0x405f39f0 cls=[F (20 bytes)
11-28 15:00:58.069: W/dalvikvm(833):  1022: 0x405f3a50 cls=[F (20 bytes)
11-28 15:00:58.069: W/dalvikvm(833):  1023: 0x405f3ab0 cls=[F (20 bytes)
11-28 15:00:58.074: W/dalvikvm(833): JNI pinned array reference table summary (1024 entries):
11-28 15:00:58.074: W/dalvikvm(833):  1020 of [F 20B (1020 unique)
11-28 15:00:58.074: W/dalvikvm(833):     4 of [F 28B (4 unique)
11-28 15:00:58.074: W/dalvikvm(833): Memory held directly by tracked refs is 20512 bytes
11-28 15:00:58.074: E/dalvikvm(833): Failed adding to JNI pinned array ref table (1024 entries)