从本机代码调用另一个包的静态java方法

Tom*_*Tom 10 java java-native-interface static android android-ndk

例如,假设在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);
}
Run Code Online (Sandbox Code Playgroud)

在java中MyClass.class,我有其他

static {System.loadLibrary("myLib");}
native long nativeMethod();
Run Code Online (Sandbox Code Playgroud)

但是当我调用它时,我收到以下错误:

ERROR/AndroidRuntime(628): java.lang.NoSuchMethodError:
android.os.SystemClock.elapsedRealtime()
Run Code Online (Sandbox Code Playgroud)

mid在线的声明.我认为这很简单,但我是jni的新手.

有人可以指出我的错误吗?

jog*_*ito 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教程以获取更多详细信息

  • 几分钟前我自己找到了这个!但是,我必须指定类的名称,如`(*env) - > FindClass(env,"android/os/SystemClock")`.谢谢! (2认同)