我目前正在为C ++类编写一个JNI包装器,我不确定到目前为止我所做的是否是最正确的方法。
据我了解,不可能声明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技能非常有限,所以不要犹豫,甚至建议更“明显”的解决方案。
非常感谢。
答案 0 :(得分:2)
这就是我总是实现包装C / C ++对象的本机类的方式。我认为编写一个本地构造函数可能会有点痛苦,所以从未尝试过。
对于取消分配,你做了一个类似的事情。编写一个C / C ++函数,为您的C / C ++对象取消分配内存,然后从java析构函数(finalize方法)中调用它。所以像这样:
private native void destroyNativeInstance( long p_internalPtr );
public void finalize()
{
destroyNativeInstance( this.internalPtr );
}