我对在本机函数中创建的对象发生的情况有点困惑,然后返回到调用Java方法。例如,我有以下Java POJO:
public class Thing{
private int valueOne = 0;
public int getValueOne(){
return valueOne;
}
public void setValueOne(int value){
valueOne = value;
}
}
我有一个本机方法创建一个Thing对象并返回它:
JNIEXPORT jobject JNICALL
create_thing(JNIEnv *env, jobject jobj){
/*
Code ommitted that gets methodID of Thing's default constructor.
*/
jobject result = (*env)->NewObject(env, thingClass, constructorID);
return result;
}
最后我有一些调用create_thing()的Java方法:
public Thing createThing(){
Thing thing = create_thing();
thing.setValueOne = 2;
return thing;
}
根据JNI规范,对NewObject的调用(在create_thing()
中生成)将向对象返回LocalReference,在本例中为Thing。 create_thing()
函数立即返回该对象,并且在由createThing()
中的Java方法调用它的情况下,删除LocalReference。
我的问题是,虽然删除了LocalReference,但对象Thing是否仍然存在(因为它在thing
方法中被分配给createThing()
)?
我是否理解为LocalReference自动删除了对象,只要它被分配给Java代码中的字段仍然存在?
此外,如果返回的Thing 不分配给某个字段,那么它会被标记为垃圾收集吗?
答案 0 :(得分:0)
是的,你说得对。
对象与JNI本地引用之间存在差异。当方法返回时,JNI框架将删除所有本地引用。 (如果愿意,您可以删除任何更早的内容。)删除引用不会删除它引用的对象。
在垃圾收集系统中,对象未标记为要收集。相反,在扫描期间,它们被标记为保留。因此,如果活动对象引用任何创建的Thing,则会保留它。扫描从一个或多个现场"根源开始,包括JNI本地和全球参考。