P45*_*ent 4 c++ java-native-interface
假设我在实现native
函数存根的 JNI 函数中有此代码:
JNIEnv* env; /*This is set to a valid JNIEnv* for this thread*/
jclass clz = env->FindClass("foo"); /*this has worked*/
Run Code Online (Sandbox Code Playgroud)
我需要打电话吗
env->DeleteLocalRef(clz);
Run Code Online (Sandbox Code Playgroud)
一旦我完成了它?我不会回到clz
Java,所以我想我需要删除本地引用?这似乎有点奇怪,因为像 a 一样MethodID
, ajclass
不包含对象实例。
调用永远不会错DeleteLocalRef
,所以你应该总是调用它,否则你可能会遇到本地引用数量用完的情况。
当您的 JNI 代码从 Java 调用并且运行时间很短时,您可能很幸运,在返回 Java 调用方后,本地引用会为您清理干净,但是如果您例如从本机代码调用 Java VM(所以没有调用您的 JNI 代码的“外部”Java VM 框架),那么您将很快用完您的局部变量,因为它们永远不会被不存在的 Java 调用者删除。
引用官方 Java 文档:
在大多数情况下,程序员应该依靠 VM 在本地方法返回后释放所有本地引用。但是,有时程序员应该显式释放本地引用。例如,考虑以下情况:
不,您不需要打电话DeleteLocalRef
。
FindClass
返回本地引用。所以没有必要删除。JNI 调用完成后,JVM 将自动执行此操作。
但如果您愿意,可以删除本地引用。应该没有什么区别。
归档时间: |
|
查看次数: |
2661 次 |
最近记录: |