问题描述
|
我目前正在为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 function)
{
this.internalPtr = createNativeInstance(application,module,function);
}
public native String getApplication();
static { System.loadLibrary(\"log_java\"); }
}
基本上,我的internalPtr
字段保存指向我的底层C ++实例的指针,并使用static native
方法createNativeInstance()
在纯Java构造函数中创建它。
这是做事的正确方法吗?
我可以得到答案的另一个问题是:“我应该如何处理解除分配?”
我的Java技能非常有限,因此请毫不犹豫地提出更多“显而易见的”解决方案。
非常感谢你。
解决方法
这就是我一直实现围绕C / C ++对象包装的本机类的方式。我认为编写本机构造函数可能会有些痛苦,因此从未尝试过。
对于取消分配,您可以执行类似的操作。编写一个C / C ++函数,为您的C / C ++对象取消分配内存,然后从java析构函数(finalise方法)中调用此函数。所以像这样:
private native void destroyNativeInstance( long p_internalPtr );
public void finalize()
{
destroyNativeInstance( this.internalPtr );
}