jni练习(二)

上一篇,写到了 java->native的流程。


下面是native调用java的过程:


前提条件是,native的过程是被动的,也就是说 java需要先调用native,从native中回过头来调用java中的函数.


1. java

与 jni练习一类似, 多添加一个 方法即可

        public int signTest(int i ,Date date , int[] arr){
                System.out.println("Sign Test "+i);
                return 0;
        }

2.native:

native层主要是一些与java交互的api,大致分为 getvalue,setvalue, callmethod等(每一种变量类型都有一个不同的api,只要会一个就可以了)

javah 生成的头文件, 函数中包含2个参数 分别是 JNIEnv * env , jobject obj,在这里我们就可以用到他们了


首先需要通过 jclass native_clazz = env->GetObjectClass(obj); 来获取java的本地类,然后通过 native_clazz进行其他操作。

1) 获取java变量:  jfieldID fieldID_num = env->GetFieldID(native_clazz,"number","I");  (假设java里面的某个成员变量是int型,变量名为number)

                            jint number = env->GetIntField(obj,fieldID_num);    这时,我们就在native层拿到了java的成员变量name

2) 设置java变量:  env->SetIntField(obj,fieldID_num,100);   //将java中的number改变成为100                           

3)调用java函数:  jmethodID methodID_func = env->GetMethodID(native_clazz,"Testjava","(ILjava/util/Date;[I)I");

                              GetMethodID, 第一个参数是本地类,第二个参数是java的函数名,第三个参数是 java函数的参数类型和返回值(具体格式可以百度)

     获取到methodID_func后,就可以调用java了。

     env->CallIntMethod(obj,methodID_func,1L,NULL,NULL); 

     由于java的函数式int型,所以这里要调用CallIntMethod, 参数3,4,5为java的参数.


按照jni练习(一)的流程,编译 运行后,即可看到结果。。写的有点乱,给我自己看的。。。记录一下免得后面忘了


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值