Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在类上应用JNI,而不是仅仅将随机函数组合在一起?_Java_C++_Java Native Interface_Native_Wrapper - Fatal编程技术网

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

Java 如何在类上应用JNI,而不是仅仅将随机函数组合在一起?,java,c++,java-native-interface,native,wrapper,Java,C++,Java Native Interface,Native,Wrapper,我想通过JNI实现整个Java类,但我只能找到有关实现方法的信息,而不能找到类本身。在我发现的每个例子中,JNI部分总是一堆函数 我有一个C++类,我想把它移植到java。我试着跟随一些教程,但失败了。它似乎对课堂不起作用 我遇到了许多问题;只有一个例子是如何处理类的构造函数 例如,问题是:如何处理类的构造函数 可以将内部本机类的指针保留在长类型的Java类成员中 为了在Java类构造函数中调用本机类的构造函数,您可以定义一个单独的本机方法来分配本机对象,并将结果指针保留在Java类长类型成员中

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

<>我有一个C++类,我想把它移植到java。我试着跟随一些教程,但失败了。它似乎对课堂不起作用

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

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

可以将内部本机类的指针保留在长类型的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;
}

您无法找到正在查找的信息的原因是该信息不存在。JNI主要是在C或C++中实现java原生方法的机制,其次是在C或C++中嵌入java的机制。为了达到这些目的,它为本机代码提供了访问和操作Java对象的方法,但它从未打算允许Java类本身在本机代码中实现,而且它也没有对此做出任何规定

您可以创建一个java类,其类都是原生的,并且可以使用此类来包装C++类(实例将每个都保留指向本机类的实例的指针,最有可能是java <代码>长< /COD>),但是不能将本机代码编译到java类中。


有一些工具可以帮助解决这类问题。首先,在我的列表中要考虑。

这个教程很好:你可能需要一个终结器或其他方法来释放本地对象,或者你有一个漏洞。@ AlanStokes,当然,我只是想指出如何调用一个内部构造函数并调用这个本地对象的方法。