摘要
对于jni来说,有时候需要使用到java中的一些方法,因此反射机制必不可少。
Jni反射
首先要用到Jni反射机制,那么我们先来看一下java的反射机制。
public class SimpleDemo {
public void show(String str){
System.out.println(str);
}
public void reflect(){
try {
Class clazz = SimpleDemo.class.getClassLoader().loadClass("com.java.basic.reflect.SimpleDemo");
Method method = clazz.getDeclaredMethod("show", String.class);
method.invoke(clazz.newInstance(), "hello world");
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
SimpleDemo demo = new SimpleDemo();
demo.reflect();
}
}
看完java层面上的反射,那么我们来看一下JNi层面的反射是如何做到的。
JNIEXPORT void JNICALL Java_com_android_imooc_jni_ReflectActivity_showFromC(JNIEnv* env,
jobject obj) {
//拿到字节吗
jclass clazz = ( *env)->FindClass(env, "com/android/imooc/jni/ReflectActivity");
//获得方法id
//jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
jmethodID id = ( *env)->GetMethodID(env, clazz, "show", "(Ljava/lang/String;)V");
//回调
//void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
jstring str = (*env)->NewStringUTF(env,"hello world");
( *env)->CallVoidMethod(env, obj, id, str);
}
这样我们就可以进行回调到java层面上,调用java的show方法。
对于JNI签名陌生的朋友,可以在Android Studio中的build–>classes的目录下,用命令行
javap -s com.Android.imooc.jni.ReflectActivity
格式为java -s 全限定名