由于JNI不能直接回调Java方法,有时候我们可能会在Native方法里面的参数放上几个空的数组,让JNI往数组里面放值,Java调用完,再从数组里面取出值。
Java代码如下:
byte[] bytes = new byte[5];
int[] test = new int[3];
for(int i = 0;i<test.length;i++){
Log.d("MainActivity","调用前:"+i+"====>>>>>:"+test[i]);
}
new H264Android().test(test,bytes);
for(int i = 0;i<test.length;i++){
Log.d("MainActivity","调用后:"+i+"====>>>>>:"+test[i]+"===>"+bytes[i]);
}
在Java代码中,为JNI准备了两个空的数组,JNI往数组里面放入数据,Java调用完以后,再从数组里面取出JNI放入的值,JNI代码如下:
void JNICALL Java_com_test_vediochat_h264_H264Android_test(JNIEnv* env, jobject thiz, jintArray javaArray,jbyteArray array2)
{
//方法一
/*
jint temp1 = 45,temp2 = 20;
(*env)->SetIntArrayRegion(env,javaArray,1,1,&temp1);
(*env)->SetIntArrayRegion(env,javaArray,2,1,&temp2);
*/
//方法二:
jint * tempSize = (jint*) (*env)->GetIntArrayElements(env, javaArray, 0);
tempSize[2] = 65;
tempSize[3] = 75;
(*env)->SetIntArrayRegion(env, javaArray, 0,3,tempSize);
}
从以上代码可以看出,有两种方法可以修改数组值,第一种方法是直接调用SetXXArrayRegion方法,其中第三个参数表示数组的下标,第四个参数表示要连续修改的长度。
第二种方法是先获得数组的指针,通过指针修改,修改后再调用SetXXArrayRegion方法提交到Java数组里面(如果不提交的话,不会修改Java数组元素的值)。