JNA可用内存由共享库分配

时间:2014-07-02 13:58:52

标签: java c memory-leaks jna

我的C API中有以下功能:

MyStruct *create();
void destroy(MyStruct **s);

我通过JNA将它们映射到:

Pointer create();
void destroy(Pointer p);

我有一个加载共享库并使用这些函数的类:

class MyClass{

    private mySharedLibrary library;
    private Pointer p;

    public MyClass(){
       this.library = (MySharedLibrary)Native.loadLibrary("mylibrary", MySharedLibrary.class);
       this.p = library.create();
    }
}

我不知道何时以及如何调用销毁功能......或者根本不应该打电话给它? Java中没有析构函数。此外,它以MyStrct **为参数......我该怎么办?

1 个答案:

答案 0 :(得分:1)

您的类应提供明确的destroy,然后使用try-with-resources模式调用该<{1}}。

如果您无法使用try-with-resources,并且出于任何原因不使用显式清理,则可以使用终结器。虽然这些都不能保证运行,但在大多数情况下它可能已经足够了。

class MyClass {
    private Object finalizer = new Object {
        protected void finalize() {
            if (MyClass.this.p != null) {
                MyClass.this.library.destroy(MyClass.this.p);
                MyClass.this.p = null;
            }
        }
    }
}

请注意,您应该在自己的用例中进行广泛测试,以确保根据您的需要回收内存。