2011-08-30 2 views
9

예를 들어 Android에서 네이티브 코드의 일부에서 long을 반환하는 정적 메서드 android.os.SystemClock.elapsedRealtime()을 호출해야한다고 가정 해 봅니다. mylib.c 파일에서, 내가 자바 MyClass.class에서네이티브 코드에서 다른 패키지의 정적 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); 
} 

을 가지고, 내가 다른 사람

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의 개체입니다. SystemClock에 대한 jclass를 얻으려면 (*env)->FindClass(env, "android/os/SystemClock")을 사용해야합니다. 그런 다음 (*env)->GetStaticMethodID(env, cls,"elapsedRealtime", "(V)J");으로 전화하여 메소드 ID를 가져옵니다. 자세한 내용은 JNI tutorial을 참조하십시오.

+2

나는 몇 분 전에 이것을 발견했습니다! 그러나'(* env) -> FindClass (env, "android/os/SystemClock")'와 같은 클래스 이름을 지정해야했습니다. 감사! – Tom

+0

당신 말이 맞아요. 오타/복사하여 붙여 넣기 실수였습니다 :-) – jogabonito

관련 문제