我的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 **为参数......我该怎么办?
答案 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;
}
}
}
}
请注意,您应该在自己的用例中进行广泛测试,以确保根据您的需要回收内存。