将本机函数中创建的对象返回给Java方法

时间:2014-12-30 00:39:31

标签: java java-native-interface

我对在本机函数中创建的对象发生的情况有点困惑,然后返回到调用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 分配给某个字段,那么它会被标记为垃圾收集吗?

1 个答案:

答案 0 :(得分:0)

是的,你说得对。

对象与JNI本地引用之间存在差异。当方法返回时,JNI框架将删除所有本地引用。 (如果愿意,您可以删除任何更早的内容。)删除引用不会删除它引用的对象。

在垃圾收集系统中,对象未标记为要收集。相反,在扫描期间,它们被标记为保留。因此,如果活动对象引用任何创建的Thing,则会保留它。扫描从一个或多个现场"根源开始,包括JNI本地和全球参考。