Call a static java method of another package from native code
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
Tom
Updated on July 20, 2022Comments
-
Tom almost 2 years
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 themylib.c
file, I haveJNIEXPORT 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 othersstatic {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)?
-
Tom over 12 yearsI had found this myself a few minutes ago! However, I had to specify the name fo the class like
(*env)->FindClass(env, "android/os/SystemClock")
. Thanks!