使用JNI的C ++ Java包装器构造

问题描述

| 我目前正在为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 );
}
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...