首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否需要释放我修改并返回的JNI数组?

是否需要释放我修改并返回的JNI数组?
EN

Stack Overflow用户
提问于 2013-11-28 14:03:51
回答 1查看 1.4K关注 0票数 1

我是JNI的新手,在我测试的一部手机上,我发现了关于ReferenceTable overflow的错误。我理解这与不在本机代码中释放JNI/Java项有关。

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

JNI代码:

代码语言:javascript
复制
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错误(Android2.3):

代码语言:javascript
复制
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)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-28 14:15:18

当您通过GetFloatArrayElements(..)函数获得元素时,您需要释放数组元素,因为JVM将其标记为“在本机代码中使用”。打电话给ReleaseFloatArrayElements()。查看详细信息:http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp17440

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20268170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档