2011-08-30 7 views
9

Örneğin, Android'de yerel kodun bir kısmından uzun bir süre döndüren android.os.SystemClock.elapsedRealtime() statik yöntemini çağırmam gerektiğini varsayalım. mylib.c dosyasında, ben java MyClass.class yılındaYerel bir koddan başka bir paketin statik bir java yöntemini çağırın

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

var, diğerleri

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

arasında var ama çağırdığınızda, aşağıdaki hatayı alıyorum:

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

de mid satırının beyanı. Bunun çok basit olduğunu düşünüyorum ama jni için yeniyim.

Birisi benim hatamı işaret edebilir mi?

cevap

8

JNI API kullanımınızın uygun olmadığı anlaşılıyor. İlk önce android.os.SystemClock'un sınıf referansını almalısınız. Obj bir parametre olarak geçti, MyClass'un bir nesnesidir. SystemClock için bir jclass almak için (*env)->FindClass(env, "android/os/SystemClock") kullanmalısınız. Sonra, yöntem kimliğini almak için (*env)->GetStaticMethodID(env, cls,"elapsedRealtime", "(V)J");'u arayın.

+2

Daha fazla ayrıntı için JNI tutorial numaralı telefona bir göz atın. Kendimi bir kaç dakika önce bulmuştum! Ancak, '(* env) -> FindClass (env, "android/os/SystemClock") 'gibi bir sınıfın adını belirtmem gerekiyordu. Teşekkürler! – Tom

+0

Haklısınız. Yazım hatası/copy-paste hatasıydı :-) – jogabonito