2014-07-02 266 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; 
      } 
     } 
    } 
} 

請注意,您應該在自己的用例中進行廣泛的測試,以確保內存根據您的需求進行回收。