我想通過JNI實現一個完整的Java類,但我只能找到有關實現方法的信息,而不是自己的類。在我發現的每個例子中,JNI部分總是隻是一堆函數。如何將JNI應用於CLASS而不是將隨機函數放在一起?
我有一個C++類,我想移植到Java。我嘗試了一些教程,但失敗了。它似乎不適用於類。
我遇到了很多問題;只是一個例子就是如何處理類的構造函數。
我想通過JNI實現一個完整的Java類,但我只能找到有關實現方法的信息,而不是自己的類。在我發現的每個例子中,JNI部分總是隻是一堆函數。如何將JNI應用於CLASS而不是將隨機函數放在一起?
我有一個C++類,我想移植到Java。我嘗試了一些教程,但失敗了。它似乎不適用於類。
我遇到了很多問題;只是一個例子就是如何處理類的構造函數。
問題是例子:我該如何處理類的構造函數。
你可以保持在一個Java類成員的內部本地類的指針與長類型。
爲了在Java類構造函數中調用本地類的構造函數,可以定義一個獨立的本地方法,它分配一個本地對象並將結果指針保存在Java類long類型成員中。
與下面的例子中,你可以看到一個簡單的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;
}
您可能需要一個終結器或其他方法來釋放本地對象,否則有泄漏。 –
@AlanStokes,ofcourse,我只想指出如何調用內部構造函數並調用此本機對象的方法 –
您找不到您要查找的信息的原因是它不存在。 JNI主要是一種在C或C++中實現Java本地方法的機制,其次是用C或C++嵌入Java的機制。爲了達到這些目的,它提供了訪問和操作Java對象的本地代碼的方法,但它從來沒有打算讓Java類本身在本地代碼中實現,並且沒有爲此提供任何規定。
您可以創建,其方法都是原生的Java類,你可以使用這樣的類來包裝你的C++類(實例將各保留一個指向本地類的一個實例,最有可能作爲一個Java long
) ,但是你不能將本地代碼編譯成Java類。
有些工具可以幫助解決這類問題。首先在我的名單上考慮將是SWIG。
本教程不錯:http://www.ibm.com/developerworks/java/tutorials/j-jni/j-jni.html –