2011-08-30 8 views
9

Ad esempio, diciamo che in Android, ho bisogno di chiamare il metodo statico android.os.SystemClock.elapsedRealtime(), che restituisce un lungo, da una porzione di codice nativo. Nel file mylib.c, hoChiama un metodo java statico di un altro pacchetto dal codice 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); 
} 

Nel java MyClass.class, ho tra gli altri

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

ma quando io lo chiamo, ottengo il seguente errore:

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

a la dichiarazione della linea mid. Penso che sia semplice ma sono nuovo di Jni.

Qualcuno può segnalare i miei errori?

risposta

8

Sembra che l'utilizzo dell'API JNI non sia corretto. Per prima cosa dovresti ottenere il riferimento di classe di android.os.SystemClock. L'obj passato come parametro, è un oggetto di MyClass. Dovresti usare (*env)->FindClass(env, "android/os/SystemClock") per ottenere una jclass per il SystemClock. Quindi chiama lo (*env)->GetStaticMethodID(env, cls,"elapsedRealtime", "(V)J"); per ottenere l'id del metodo. Date un'occhiata allo JNI tutorial per ulteriori dettagli

+2

L'avevo trovato anch'io pochi minuti fa! Tuttavia, ho dovuto specificare il nome della classe come '(* env) -> FindClass (env," android/os/SystemClock ")'. Grazie! – Tom

+0

hai ragione. È stato un errore di battitura/copia-incolla :-) – jogabonito

Problemi correlati