2011-08-30 14 views
9

Por ejemplo, digamos que en Android, necesito llamar al método estático android.os.SystemClock.elapsedRealtime(), que devuelve un largo, de una porción de código nativo. En el archivo mylib.c, tengoLlamar a un método java estático de otro paquete desde el código nativo

JNIEXPORT jlong JNICALL 
Java_com_mpackage_MyClass_nativeMethod(JNIEnv *env, jobject obj){ 

    jclass cls = (*env)->GetObjectClass(env, obj); 
    jmethodID mid = (*env)->GetStaticMethodID(env, cls, "android.os.SystemClock.elapsedRealtime", "(V)J"); 

    if (mid == 0) 
    return 0L; 

    return CallStaticLongMethod(cls, mid); 
} 

en el java MyClass.class, tengo entre otros

static {System.loadLibrary("myLib");} 
native long nativeMethod(); 

pero cuando lo llamo, me sale el siguiente error:

ERROR/AndroidRuntime(628): java.lang.NoSuchMethodError: 
android.os.SystemClock.elapsedRealtime() 

en la declaración de la línea mid. Creo que esto es sencillo, pero soy nuevo en jni.

¿Alguien puede señalar mi error (s)?

Respuesta

8

Parece que el uso de la API de JNI no es adecuado. Primero debe obtener la referencia de clase android.os.SystemClock. El obj pasado como parámetro, es un objeto de MyClass. Debería usar (*env)->FindClass(env, "android/os/SystemClock") para obtener un jclass para SystemClock. Luego llame al (*env)->GetStaticMethodID(env, cls,"elapsedRealtime", "(V)J"); para obtener el ID del método. Eche un vistazo a JNI tutorial para más detalles

+2

¡Lo encontré hace unos minutos! Sin embargo, tuve que especificar el nombre de la clase como '(* env) -> FindClass (env," android/os/SystemClock ")'. ¡Gracias! – Tom

+0

tienes razón. Fue un error tipográfico/copiar y pegar :-) – jogabonito

Cuestiones relacionadas