上一篇,写到了 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练习(一)的流程,编译 运行后,即可看到结果。。写的有点乱,给我自己看的。。。记录一下免得后面忘了