我是否需要删除JNI Call返回的JSTRING对象?

 2023-01-20    296  

问题描述

假设我正在使用JNI调用一些返回String的Java方法. e. jstring在本机代码中:

jstring jStr = (jstring)env->CallStaticObjectMethod(myApplicationClass, getString);

然后我需要致电env->DeleteLocalRef(jStr)?我想我这样做了,但是我找不到在JNI参考中陈述的任何特定说明,并且我可以看到我有很多不称呼它的代码 – 尝试过和真实的代码.但是,如果有较小的内存泄漏,没有人会注意到,因为此代码不会创建许多对象.

我是否需要删除JNI Call返回的JSTRING对象?

推荐答案

当您的JNI称为函数返回JAVA时,您创建的每个本地参考都会自动释放.

您可能想在哪里使用DeleteLocalRef:

一种本机方法访问一个大Java对象,从而创建对Java对象的本地引用.然后,本机方法执行
返回呼叫者之前,请进行其他计算.本地的
引用大型Java对象将阻止对象为
收集的垃圾,即使对象不再使用
计算的其余部分.

换句话说,如果您分配了一个多毛线字符串并且不再需要它,则可以立即删除参考,而不是当您返回时将其留给JVM.但是,只有在您需要在返回JNI世界中执行其他步骤时才有用.

请注意,这种情况会讨论JNI函数,该函数称为Java .
通过将本机线程连接到JVM,您可以在反向情况下最终进入,在此情况下,本机代码调用 jvm.在这种情况下,JVM将不是无自动的本地参考,您需要自己删除本地参考.

作为这种情况的具体示例,在 JNI食谱中的此功能 Will持续;他们从不手动清理.

一种天然方法会创建大量的本地参考,尽管并非所有这些参考都同时使用.由于VM需要
一定数量的空间来跟踪本地参考,创建
太多的本地参考可能会导致系统用尽内存.
例如,本机方法通过大量对象循环,
检索元素作为本地参考,并在一个元素上操作
每次迭代的元素.每次迭代后,程序员不
更长的时间需要对数组元素的本地引用.

这个更简单:本地参考的数量有上限.

其他推荐答案

是的,您必须处置Java回调返回的本地引用.标准规则应用:您可以使用PushlocalFrame()/poplocalframe(),而不是DeleteLocalRef(),或者在线程从JVM分离时将自动释放本地参考,或者本机方法返回JAVA(如果发生在内部,则会发生这种情况(如果发生这种情况,则会发生这种情况.本机方法).

以上所述是小编给大家介绍的我是否需要删除JNI Call返回的JSTRING对象?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26033.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。