2011-09-30 80 views
10

我正在用Java編寫一個程序,我想爲使用C++編寫的庫創建一個本地接口。但是我對如何爲構造函數編寫本地方法聲明感到困惑。爲構造函數創建java本地方法

說我有這個C++類的構造函數:

template <class _Tp,class _Val> 
    class Arbitrator 
    { 
    public: 
    Arbitrator(); 
    } 

我怎麼會寫一個本地方法的聲明?

這就是我到目前爲止所做的: package hbot.proxy.bwsal.arbitrator;

public class Arbitrator<Tp, Val> 
{ 
    public native Arbitrator Arbitrator(); 
} 

這是我該怎麼做的?

謝謝

+0

javah對你的課程有何評論?如果有效,您可以使用它。 – bmargulies

回答

12

創建本地方法。例如,private native void init()。在Java中從構造函數中調用它。在它的JNI實現中,根據需要訪問C++類。

無論如何,您將不得不使用JNI生成的方法簽名,因此如果這是您想要執行的操作,則無法將Java類直接映射到C++類。

+0

對,我明白,實現代碼將不得不使用JNI方法簽名,我只是想知道這是否是正確的構造函數的本地聲明,或者是否會更好地按照您所說的調用本地方法Java構造函數? –

+1

你不能有本地構造函數。所以'init'方法可能是你最好的選擇。我認爲這也是一種很好的風格。 –

+0

當你想在C++中保留'Init'私有的時候你會怎麼做?或者根本無法修改課程? – MasterMastic

0

爲了從C++ JNI代碼調用Java類構造函數,您需要在這裏使用JNI構造函數。假設你已經在你的C++函數這樣傳遞給JVM的參考與的JNIEnv

//函數聲明

void Java_com_hunter_mcmillen_Arbitrator (JNIEnv *env, jobject thiz) {

//對具有Java類的方法

jclass itemClazz = env->FindClass("com/hunter/mcmillen/myjava/myclasses/Arbitrator");

//參考方法在你的java類

jmethodID constructor = env->GetMethodID(itemClazz, "<init>", "(Ljava/lang/Object;Ljava/lang/Object)V");

}

現在你可以真正調用構造函數的C++代碼。