2014-07-02 217 views
1

分配我在我的C API以下功能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

你确定你的'destroy'签名是正确的吗?它看起来像是由'create'返回的值的地址,而不是值本身。 – technomage

回答

1

您的课程应提供明确的destroy,然后使用try-with-resources模式调用该模式。

如果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; 
      } 
     } 
    } 
} 

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