jni练习(二)

来源:互联网 发布:借尸还魂事件 知乎 编辑:程序博客网 时间:2024/06/13 23:27

上一篇,写到了 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
原创粉丝点击