如何在CLASS上应用JNI而不是仅仅将随机函数组合在一起?

时间:2016-01-23 15:30:51

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

我想通过JNI实现一个完整的Java类,但我只能找到有关实现方法的信息,而不是类本身。在我发现的每个例子中,JNI部分总是只是一堆功能。

我有一个C ++类,我想将其移植到Java。我尝试了一些教程,但失败了。它似乎不适用于课程。

我遇到了很多问题;只有一个例子是如何处理类的构造函数。

2 个答案:

答案 0 :(得分:1)

  

问题是示例:如何处理类的构造函数。

您可以将内部Native类的指针保存在具有 long 类型的Java类成员中。

为了在Java类构造函数中调用本机类的构造函数,您可以定义一个单独的本机方法,该方法分配本机对象并将结果指针保留在Java类长类型成员中。

通过下面的示例,您可以看到一个简单的Java包装器类及其JNI实现,它说明了如何调用构造并调用内部本机指针:

public class JavaClassName {
     private long nHandle;

     protected JavaClassName() {
         nHandle = ConstructNativeHandle();
        }

    public native void SomeMethodJava();

    }

和jni实施:

JNIEXPORT long JNICALL Java_packageName_JavaClassName_ConstructNativeHandle
  (JNIEnv *env, jobject obj)
{
    NativeClassName * pNativeObject = new NativeClassName();

    return (jlong)pNativeObject;

}

JNIEXPORT void JNICALL Java_packageName_JavaClassName_SomeMethodJava
  (JNIEnv * env, jobject obj)
{
    jclass c = env->GetObjectClass(obj);
    // J is the type signature for long:
    jfieldID fid_handle = env->GetFieldID(c, "nHandle", "J");
    NativeClassName * nativeObject = (NativeClassName *) env->GetLongField(obj, fid_handle);

    nativeObject->SomeMethodNative();

    return;
}

答案 1 :(得分:1)

您无法找到所需信息的原因是它不存在。 JNI主要是一种在C或C ++中实现Java本机方法的机制,其次是在C或C ++中嵌入Java的机制。为了实现这些目的,它为本机代码提供了访问和操作Java对象的方法,但它从来没有打算允许Java类本身在本机代码中实现,并且没有为此做出规定。

您可以创建一个Java类,其方法都是本机的,您可以使用这样的类来包装C ++类(每个实例都会保留一个指向本机类实例的指针,最有可能是Java {{1但是你无法将本机代码编译成Java类。

有些工具可以帮助解决这类问题。我要考虑的首先是SWIG