从本机代码调用另一个包的静态java方法
例如,假设在Android中,我需要调用静态方法从本机代码调用另一个包的静态java方法,java,android,static,java-native-interface,android-ndk,Java,Android,Static,Java Native Interface,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); jmeth
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);
}
在javaMyClass.class
中,我有
static {System.loadLibrary("myLib");}
native long nativeMethod();
但是当我调用它时,我得到以下错误:
ERROR/AndroidRuntime(628): java.lang.NoSuchMethodError:
android.os.SystemClock.elapsedRealtime()
在mid
行的声明处。我认为这很简单,但我对jni还是新手
有人能指出我的错误吗 看起来您对JNIAPI的使用不正确。
首先,您应该获得android.os.SystemClock的类引用。作为参数传递的obj是
MyClass
的对象。您应该使用(*env)->FindClass(env,“android/os/SystemClock”)
为SystemClock获取jclass。然后调用(*env)->GetStaticMethodID(env,cls,“elapsedRealtime”,“V)J”)
获取方法id。请查看以了解更多详细信息几分钟前我自己就发现了这个!但是,我必须指定类的名称,比如(*env)->FindClass(env,“android/os/SystemClock”)
。谢谢