Jni基础开发入门(六)

摘要

对于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 全限定名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值