2011-06-15 82 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