2016-01-23 70 views
0

我想通過JNI實現一個完整的Java類,但我只能找到有關實現方法的信息,而不是自己的類。在我發現的每個例子中,JNI部分總是隻是一堆函數。如何將JNI應用於CLASS而不是將隨機函數放在一起?

我有一個C++類,我想移植到Java。我嘗試了一些教程,但失敗了。它似乎不適用於類。

我遇到了很多問題;只是一個例子就是如何處理類的構造函數。

+0

本教程不錯:http://www.ibm.com/developerworks/java/tutorials/j-jni/j-jni.html –

回答

1

問題是例子:我該如何處理類的構造函數。

你可以保持在一個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; 
} 
+0

您可能需要一個終結器或其他方法來釋放本地對象,否則有泄漏。 –

+0

@AlanStokes,ofcourse,我只想指出如何調用內部構造函數並調用此本機對象的方法 –

1

您找不到您要查找的信息的原因是它不存在。 JNI主要是一種在C或C++中實現Java本地方法的機制,其次是用C或C++嵌入Java的機制。爲了達到這些目的,它提供了訪問和操作Java對象的本地代碼的方法,但它從來沒有打算讓Java類本身在本地代碼中實現,並且沒有爲此提供任何規定。

您可以創建,其方法都是原生的Java類,你可以使用這樣的類來包裝你的C++類(實例將各保留一個指向本地類的一個實例,最有可能作爲一個Java long) ,但是你不能將本地代碼編譯成Java類。

有些工具可以幫助解決這類問題。首先在我的名單上考慮將是SWIG

相關問題