Call a static java method of another package from native code
For example, let's say that in Android, I need to call the static method android.os.SystemClock.elapsedRealtime()
, which returns a long, from a portion of native code. In the mylib.c
file, I have
JNIEXPORT jlong JNICALL
Java_com_mpackage_MyClass_nativeMethod(JNIEnv *env, jobject obj){
jclass cls = (*env)->GetObjectClass(env, obj);
jmethodID mid = (*env)->GetStaticMethodID(env, c开发者_如何学编程ls, "android.os.SystemClock.elapsedRealtime", "(V)J");
if (mid == 0)
return 0L;
return CallStaticLongMethod(cls, mid);
}
In the java MyClass.class
, I have among others
static {System.loadLibrary("myLib");}
native long nativeMethod();
but when I call it, I get the following error:
ERROR/AndroidRuntime(628): java.lang.NoSuchMethodError:
android.os.SystemClock.elapsedRealtime()
at the declaration of mid
line. I think this is straightforward but I'm new to jni.
Can someone point out my mistake(s)?
Looks like your usage of the JNI API is not proper.
First you should get the class reference of android.os.SystemClock
. The obj passed as a parameter, is an object of MyClass
. You should use (*env)->FindClass(env, "android/os/SystemClock")
to get a jclass for the SystemClock. Then call (*env)->GetStaticMethodID(env, cls,"elapsedRealtime", "(V)J");
to get the method id. Take a look at the JNI tutorial for further details
精彩评论