我想通过JNI实现一个完整的Java类,但我只能找到有关实现方法的信息,而不是类本身。在我发现的每个例子中,JNI部分总是只是一堆功能。
我有一个C ++类,我想将其移植到Java。我尝试了一些教程,但失败了。它似乎不适用于课程。
我遇到了很多问题;只有一个例子是如何处理类的构造函数。
答案 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。