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

时间:2011-06-15 08:31:30

标签: java c++ java-native-interface wrapper

我目前正在为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技能非常有限,所以不要犹豫,甚至建议更“明显”的解决方案。

非常感谢。

1 个答案:

答案 0 :(得分:2)

这就是我总是实现包装C / C ++对象的本机类的方式。我认为编写一个本地构造函数可能会有点痛苦,所以从未尝试过。

对于取消分配,你做了一个类似的事情。编写一个C / C ++函数,为您的C / C ++对象取消分配内存,然后从java析构函数(finalize方法)中调用它。所以像这样:

private native void destroyNativeInstance( long p_internalPtr );

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