gpt4 book ai didi

java-native-interface - JNI可以释放Java层对象吗?

转载 作者:行者123 更新时间:2023-12-04 08:38:55 25 4
gpt4 key购买 nike

我通过调用返回 jobject 值的 native 代码来创建 Java 对象。

Java代码:

Object myObj = nativeCreateObject();

native 代码:

jobject* hold_ref;
JNIEXPORT jobject JNICALL
nativeCreateObject(JNIEnv *env ...) {
.....
result = env->NewGlobalRef(jobj);
hold_ref = &result;
return result;
}

我的问题是:我以后是否可以使用 hold_ref 在 native 层通过引用释放 myObj?例如 native 代码:

*hold_ref = NULL;

那么Java层的myObj为null?如果没有,我如何通过 native 代码释放此对象?

最佳答案

我不确定你想要实现什么,但它的基本工作原理如下:

whether I can use hold_ref later to release the myObj by reference in native layer?

是的,您可以而且应该使用 env->DeleteGlobalRef(myObj) 来释放您创建的全局引用,以便垃圾收集器可以清理并最终销毁该对象。

Then the myObj in Java layer is null? if not, how can I release this object by native code?

当您从 jni native 代码中删除引用时,您的 Java 变量不可能神奇地变为 null。 Java 本身持有一个引用以防止对象被垃圾回收删除。

你可能想这样使用它:

C++

jobject* hold_ref;

JNIEXPORT jobject JNICALL nativeCreateObject(JNIEnv *env ...) {
.....
result = env->NewGlobalRef(jobj);
hold_ref = &result;
return result;
}

JNIEXPORT void JNICALL nativeDestroyObject(JNIEnv *env ...) {
.....
env->DeleteGlobalRef(jobj);
hold_ref = nullptr;
}

Java

// Creates two references (native and local variable)
Object myObj = nativeCreateObject();

// Deletes the native reference, but not the local one
nativeDeleteObject(myObj);
// myObj != null

myObj = null;
// now there is no reference to your created object
// the garbage collector may destroy it any time

如果你想以某种方式使你的对象无效,我建议管理状态并抛出异常,如果对象是这样无效的:

class MyInvalidateableObject {

private boolean invalidated = false;

public void invalidate() {
this.invalidated = true;
}

public void foo() {
if (invalidated)
throw new IllegalStateException("Object has been invalidated");
... // do the normal stuff
}
}

只需从 native 代码对您的对象调用 invalidate() 即可防止它再被使用。

关于java-native-interface - JNI可以释放Java层对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42989050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com