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, cls, "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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With