2011-08-30 22 views
9

Na przykład załóżmy, że w systemie Android muszę wywołać metodę statyczną android.os.SystemClock.elapsedRealtime(), która zwraca długi, z części kodu natywnego. W pliku mylib.c mamWywołanie statycznej metody języka Java innej paczki z kodu macierzystego

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); 
} 

W java MyClass.class mam m.in.

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

ale kiedy ja to nazywam, pojawia się następujący błąd:

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

w deklaracja linii mid. Myślę, że to jest proste, ale jestem nowy w jni.

Czy ktoś może wskazać mój błąd (y)?

Odpowiedz

8

Wygląda na to, że korzystanie z interfejsu API JNI nie jest poprawne. Najpierw powinieneś uzyskać odwołanie do klasy: android.os.SystemClock. Obiekt przekazany jako parametr jest obiektem o numerze MyClass. Powinieneś użyć (*env)->FindClass(env, "android/os/SystemClock"), aby uzyskać jclass dla SystemClock. Następnie zadzwoń pod numer (*env)->GetStaticMethodID(env, cls,"elapsedRealtime", "(V)J");, aby uzyskać identyfikator metody. Spójrz na numer JNI tutorial, aby uzyskać dalsze informacje.

+2

Znalazłem to kilka minut temu! Jednak musiałem podać nazwę klasy "' (* env) -> FindClass (env, "android/os/SystemClock") '. Dzięki! – Tom

+0

masz rację. To był błąd literowy/kopiuj-wklej :-) – jogabonito

Powiązane problemy