NDK 开发C中通过反射调用Java代码

Eclipse在C中通过反射调用java空方法流程:


1.声明一个本地方法,
2.拿到项目的src目录地址,输入命令 :cd /d  src目录
3.进入src目录后,输入命令 : javah 本地方法所在类的全路径
3.拿到.h文件中本地方法的头,完成jni文件夹中.c文件的编码(通过反射的过程和使用java反射的方式一致)
           1.通过调用FindClass 拿到字节码文件  : jclass claz=(*env)->FindClass(env,"com/example/fromc2calljava/Native"); FinClass(第二个参数是被调


java方法所在类的地址(把被调java方法所在类的全路径的点改成斜线就行了)
  2.通过字节码对象调用方法,如:通过GetMethodID(字节码对象,被调用java方法名,被调用方法的签名)
                   jmethodID methodID= (*env)->GetMethodID(env, claz, "helloFromJava", "()V"); 
           3.如何拿到被调用方法的签名
                a.拿到项目的bin目录地址输入:cd /d F:\AndroidProject\AndroidJNI\FromC2CallJava\bin
b.进入classes目录 :cd classes
c.拿到需要方法的签名javap -s 加上我们需要在C中调用的那个Java方法所在类的全路径:javap -s com.example.fromc2calljava.Native
d.填入GetMethodID(第三个参数);
          
           4.谁来调用(被调java方法所在类的对象来调用):我们知道每一个本地方法都有(JNIEnv* env,jobject clazz),其中第一个参数是jni environment   


              是个二级指针,第二个参数是调用我们本地方法的那个对象,也是我们本地方法所在类的对象。但是我这个java方法就和本地方法写在了同一个类中,  


              所以本地方法所在类的对象,也是此刻调用java方法的那个对象,也就是clazz;或者通过字节码文件来造一个对象
              jobject obj=(*env)->AllocObject(env,claz);但是值得注意的是,如果被调用的方法里需要传递上下文的时候,这样不行的,会报空指针,所以把被


              调方法和本地方法写在同一个类中,通过构造方法传递一个上下文进去就可以了,同时只可以采用jobject clazz,不需要
               jobject obj=(*env)->AllocObject(env,claz);
           


 5.触发我们需要被调用的那个方法 (返回值为空的方法):(*env)->CallVoidMethod(env,clazz,methodID);
            (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);最后“...”就是被调用方法的的参数列表,值得注意的是,这是在C里调用java方法,传递的  


            参数必须是java里的类型,但是这里是C中,所以必须把c中的参数类型转成java类型的,如:java方法有一个参数是String,C中就必须NewStringUTF把C中


            的char转成jstring,此外也会有CallIntMethod等,主要看被调java方法的返回值
6.直接run as application,不需要在项目所在目录下ndk-build,eclipse自动帮我们完成


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值