2011-08-30 12 views
9

例如,假設在Android中,我需要調用靜態方法android.os.SystemClock.elapsedRealtime(),該方法從本機代碼的一部分返回一個long。在mylib.c文件,我有從本機代碼調用另一個包的靜態java方法

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

在Java MyClass.class,我等

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

,但是當我把它,我得到以下錯誤:

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

mid行的聲明。我認爲這很簡單,但我對jni很陌生。

有人能指出我的錯誤嗎?

回答

8

看起來你對JNI API的使用是不正確的。 首先,您應該獲得android.os.SystemClock的類參考。 obj作爲參數傳遞,是MyClass的對象。您應該使用(*env)->FindClass(env, "android/os/SystemClock")來獲取SystemClock的jclass。然後撥打(*env)->GetStaticMethodID(env, cls,"elapsedRealtime", "(V)J");以獲取方法ID。看看JNI tutorial進一步的細節

+2

我幾分鐘前發現了我自己!但是,我必須指定類的名稱,例如'(* env) - > FindClass(env,「android/os/SystemClock」)'。謝謝! – Tom

+0

你是對的。這是一個錯字/複製粘貼錯誤:-) – jogabonito

相關問題