使用JNI构建C++ Java包装器

5

我目前正在为一个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++ 实例的指针,我在一个纯 Java 构造函数中使用 `static native` 方法 `createNativeInstance()` 创建它。
这样做是正确的吗?
另一个问题是:如何处理释放内存?
我的 Java 技能非常有限,所以请毫不犹豫地建议甚至更“显而易见”的解决方案。
非常感谢。

1
检查JNA,也许更容易入手。 - lexicore
1个回答

2

这是我一直以来实现包装C/C++对象的本地类的方式。我认为编写本地构造函数可能有点麻烦,所以从未尝试过。

对于释放内存,你需要做类似的事情。编写一个C/C++函数来释放你的C/C++对象的内存,然后从Java析构函数(finalise方法)中调用它。代码如下:

private native void destroyNativeInstance( long p_internalPtr );

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

看起来是一个优雅的解决方案。谢谢! - ereOn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接