2012-02-24 12 views
11

¿Cómo especifico en el parámetro de firma de función GetMethodID que la función para la que obtengo la identificación acepta una matriz de una clase personalizada?¿Cómo especificar una matriz de clase en el parámetro de firma del método GetMethodID?

tengo una función en Java con firma:

void getData(ListDataClass[] arryData) 

Y quiero conseguir el método de identificación de esta función desde la interfaz JNI utilizando la función GetMethodID. Para
que he mencionado en el parámetro firma de la función de la siguiente manera:

"([myPackeg/ListDataClass)V" 

Pero esto no está funcionando y me sale excepción, ya que Method Not Found. Lo mismo funciona si especifico una matriz de clase de cadena.

+0

son usted que llama desde el hilo principal o desde un subproceso diferente? Si llama desde un hilo diferente (como un hilo que ha creado dentro de su código nativo) necesitará hacer cosas adicionales. –

+0

@Alex, ¿a qué te refieres con decir cosas adicionales? Estoy llamando desde diferentes hilos y algo está mal. – nabroyan

Respuesta

23

JNI las firmas de tipos de totalmente calificados clases toman la forma:

Lclass/path/ClassName; 

Por ejemplo:

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

Una firma método se construye a partir de éstos mediante la colocación de argumentos entre paréntesis primero y el devolver tipo después del corchete derecho. Por ejemplo:

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

Usted puede encontrar la documentación para las firmas de tipos de JNI here, que es donde me prestó el ejemplo anterior de.

En el ejemplo específico:

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

Nota: el tipo de firma exacta depende de su ruta de clase.

Luego, puede encontrar el ID del método de la siguiente manera (suponiendo que C++ y un puntero JNIEnv llamado env):

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

tiene un error tipográfico allí: '([Lclass/path/ListDataClass;) V', no' (L [class/path/ListDataClass;) V' – ankhzet

+0

solucionó eso, gracias – GooseSerbus

Cuestiones relacionadas