2011-09-30 22 views
10

Sto scrivendo un programma in Java e vorrei creare un'interfaccia nativa per una libreria scritta in C++. Ma sono confuso da come scrivere una dichiarazione di metodo nativa per un costruttore.Creare il metodo java nativo per il costruttore

Dire che ho questa classe C++ e costruttore:

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

Come dovrei scrivere una dichiarazione di metodo nativo?

Questo è quello che sto facendo finora: pacchetto hbot.proxy.bwsal.arbitrator;

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

È questo come lo farei?

Grazie

+0

Cosa dice javah della tua classe? Se funziona, puoi usarlo. – bmargulies

risposta

12

Creare un metodo nativo. Ad esempio, private native void init(). Chiamalo dal costruttore in Java. Nella sua implementazione JNI accede alla classe C++ secondo necessità.

Sarà necessario utilizzare le firme dei metodi generate JNI in ogni caso, quindi non è possibile mappare direttamente la classe Java alla classe C++ se è quello che si voleva fare.

+0

a destra, ho capito che il codice di implementazione dovrà utilizzare le firme del metodo JNI, mi stavo chiedendo se sarebbe la dichiarazione nativa corretta del costruttore, o sarebbe meglio fare come dici tu e chiamare un metodo nativo da il costruttore Java? –

+1

Non è possibile avere un costruttore nativo. Quindi avere il metodo 'init' è probabilmente la soluzione migliore. Penso che sia anche un buon stile. –

+0

Cosa fai quando vuoi mantenere il comando 'Init' in C++? o quando non è possibile modificare la classe? – MasterMastic

0

Per chiamare un costruttore di classi Java dal codice JNI C++, è necessario utilizzare qui i costrutti JNI. Supponendo di aver passato un riferimento alla JVM con MEnv nella funzione ++ in questo modo C:

// Funzione dichiarazione

void Java_com_hunter_mcmillen_Arbitrator (JNIEnv *env, jobject thiz) {

// riferimento alla classe Java che ha la vostra metodo

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

// riferimento al metodo nella classe java

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

}

E ora si può effettivamente chiamare la funzione di costruzione nel codice C++.

Problemi correlati