Вызов статического метода Java другого пакета из нативного кода - PullRequest
10 голосов
/ 30 августа 2011

Например, предположим, что в Android мне нужно вызвать статический метод android.os.SystemClock.elapsedRealtime(), который возвращает long из части нативного кода. В файле mylib.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);
}

В Java MyClass.class, у меня есть среди других

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

но когда я его вызываю, я получаю следующую ошибку:

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

при объявлении mid строки. Я думаю, что это просто, но я новичок в Jni.

Может ли кто-нибудь указать на мою ошибку (ошибки)?

1 Ответ

8 голосов
/ 30 августа 2011

Похоже, что вы используете JNI API неправильно. Сначала вы должны получить ссылку на класс android.os.SystemClock. Объект, переданный в качестве параметра, является объектом MyClass. Вы должны использовать (*env)->FindClass(env, "android/os/SystemClock"), чтобы получить jclass для SystemClock. Затем вызовите (*env)->GetStaticMethodID(env, cls,"elapsedRealtime", "(V)J");, чтобы получить идентификатор метода. Посмотрите учебник JNI для получения более подробной информации

...