2012-02-24 20 views
11

Come specificare nel parametro di firma della funzione GetMethodID che la funzione che ottengo id per accetta l'array di una classe personalizzata?Come specificare la matrice della classe nel parametro della firma del metodo GetMethodID?

Ho una funzione java con la firma:

void getData(ListDataClass[] arryData) 

e voglio ottenere il metodo id di questa funzione dall'interfaccia JNI utilizzando la funzione GetMethodID.
Per questo ho citato nel parametro firma della funzione come segue:

"([myPackeg/ListDataClass)V" 

Ma questo non sta funzionando e ottengo eccezione come Method Not Found. La stessa cosa funziona se si specifica l'array della classe string.

+0

sta chiamando dal thread principale o da un thread diverso? Se stai chiamando da un thread diverso (come un thread che hai creato all'interno del tuo codice nativo) dovrai fare altre cose. –

+0

@Alex cosa intendi dire cose aggiuntive? Sto chiamando da thread diversi e qualcosa non va. – nabroyan

risposta

23

JNI tipo firme per pienamente qualificati classi prendono la forma:

Lclass/path/ClassName; 

Ad esempio:

"Ljava/lang/String;" // String 
"[Ljava/lang/String;" // String[] (array) 

Una firma metodo è costruita da questi mettendo argomenti tra parentesi prima e la restituire il tipo dopo la parentesi destra. Per esempio:

long f (int n, String s, int[] arr); // Java method 
"(ILjava/lang/String;[I)J" // JNI type signature 

È possibile trovare la documentazione per per JNI tipo firme here, che è dove ho preso in prestito l'esempio di cui sopra da.

Nel tuo esempio specifico:

void getData(ListDataClass[] arryData) // Java method 
"([Lclass/path/ListDataClass;)V" // JNI type signature 

Nota: la firma esatto tipo dipende dal vostro percorso di classe.

È possibile quindi trovare l'ID del metodo come segue (C++ assumendo e un puntatore MEnv chiamato ENV):

jclass clz = env->FindClass("class/path/ListDataClass"); 
jmethodID mid = env->GetMethodID(clz, "getData", "([Lclass/path/ListDataClass;)V"); 
+0

hai un errore di battitura lì: '([Lclass/percorso/ListDataClass;) V', non' (L [class/path/ListDataClass;) V' – ankhzet

+0

risolto che, grazie – GooseSerbus

Problemi correlati