2011-08-30 35 views
9

Ví dụ: giả sử trong Android, tôi cần gọi phương thức tĩnh android.os.SystemClock.elapsedRealtime(), trả về một khoảng thời gian dài, từ một phần mã gốc. Trong tập tin mylib.c, tôi cóGọi phương thức java tĩnh của gói khác từ mã gốc

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

trong java MyClass.class, tôi có những người khác

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

nhưng khi tôi gọi nó, tôi nhận được lỗi sau:

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

tại tuyên bố của mid dòng. Tôi nghĩ rằng điều này là đơn giản nhưng tôi mới với jni.

Ai đó có thể chỉ ra (các) lỗi của tôi không?

Trả lời

8

Dường như việc sử dụng API JNI của bạn không phù hợp. Trước tiên, bạn sẽ nhận được tham chiếu lớp học của android.os.SystemClock. Obj được truyền dưới dạng tham số, là đối tượng của MyClass. Bạn nên sử dụng (*env)->FindClass(env, "android/os/SystemClock") để có được một lớp học cho SystemClock. Sau đó, gọi (*env)->GetStaticMethodID(env, cls,"elapsedRealtime", "(V)J"); để lấy id phương thức. Hãy xem JNI tutorial để biết thêm chi tiết

+2

Tôi đã tự tìm thấy điều này một vài phút trước! Tuy nhiên, tôi phải chỉ định tên cho lớp như '(* env) -> FindClass (env," android/os/SystemClock ")'. Cảm ơn! – Tom

+0

bạn nói đúng. Đó là lỗi đánh máy/sao chép-dán :-) – jogabonito

Các vấn đề liên quan