最近在android上开发一个PDF阅读器,需要将NDK的数据传送到java中显示。值得注意的是,NDK中用c的内存分配函数分配的内存空间,不能直接return给java中使用。
反正坚持一个原则:C分配的内存只能C来使用,java分配的内存只可以java使用。至于C和java之间的内存交换,NDK提供了额外的函数。
下面举例说明:一个java中分配int[],然后传递给C,C中将数组中所有的数翻倍,然后返回给java。
c代码如下:
jintArray
Java_com_summer_PointerTestActivity_test( JNIEnv* env,
jobject thiz,jintArray nums)
{
//获取传入数组的长度
jsize len = (*env)->GetArrayLength(env, nums);
//在java中申请一块内存 以用来将C的数组传输给java程序
jintArray ret=(*env)->NewIntArray(env,len);
//获取传入的数组
jint *body = (*env)->GetIntArrayElements(env, nums, 0);
int i;
for(i=0;i<len;i++)
{
body[i] *=2;
}
//将C的数组拷贝给java中的数组
(*env)->SetIntArrayRegion(env,ret,0,len,body);
return ret;
}
具体介绍几个函数:
函数功能:获取java传入的数组的长度。jsize len = (*env)->GetArrayLength(env, nums);
函数功能:在java中申请整形数组,这个数组可以返回给java使用。注意,这里不能用new或者malloc函数代替。因为new出来的空间还在c中,java是不能直接使用的。jintArray ret=(*env)->NewIntArray(env,len);
函数功能:将java传入的数组本地化,即获取java传入的数组的起始位置。jint *body = (*env)->GetIntArrayElements(env, nums, 0);
(*env)->SetIntArrayRegion(env,ret,0,len,body);
函数功能:将c的数组拷贝到java中的数组。注意,这里不能直接像使用普通c数组那样直接赋值。因为java中的数组,c是不能直接操作的。
示例源码见:http://download.csdn.net/detail/semillon/3764734
参考文献:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/19/2145486.html