2011-06-15 53 views
5

我目前正在爲C++類寫一個JNI包裝器,而且我不確定到目前爲止我所做的是否是最正確的方法。用JNI編寫C++ Java包裝器

據我瞭解,這是不可能的聲明Java的構造native,所以我最後寫一樣的東西:

package log; 

public class Logger 
{ 
    private long internalPtr = 0; 

    private native long createNativeInstance(String application, String module, String function); 

    public Logger(String application, String module, String function) 
    { 
     this.internalPtr = createNativeInstance(application, module, function); 
    } 

    public native String getApplication(); 

    static { System.loadLibrary("log_java"); } 
} 

基本上,我internalPtr字段保存指針到我的底層C++實例,我使用static native方法createNativeInstance()在純Java構造函數中創建它。

這是正確的做事方式嗎?

我可以得到答案的另一個問題是:「我應該如何處理釋放?

我的Java技能非常有限,所以不要猶豫,甚至建議更「明顯」的解決方案。

非常感謝。

+1

檢查JNA,可能更容易開始。 – lexicore 2011-06-16 06:17:23

回答

2

這就是我總是實現包裝C/C++對象的本地類的方式。我認爲編寫一個本地構造函數可能有點痛苦,所以從未嘗試過。

對於取消分配,你做一個simolar事情。編寫一個C/C++函數,爲C/C++對象取消分配內存,然後從java析構函數(finalize方法)中調用該函數。所以像這樣:

private native void destroyNativeInstance(long p_internalPtr); 

public void finalize() 
{ 
    destroyNativeInstance(this.internalPtr); 
} 
+0

它看起來像一個優雅的解決方案。謝謝 ! – ereOn 2011-06-16 07:21:51