Android NDK中C和java之间数组的传送

        最近在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;
}

具体介绍几个函数:

    jsize len = (*env)->GetArrayLength(env, nums);


函数功能:获取java传入的数组的长度。

jintArray ret=(*env)->NewIntArray(env,len);
函数功能:在java中申请整形数组,这个数组可以返回给java使用。注意,这里不能用new或者malloc函数代替。因为new出来的空间还在c中,java是不能直接使用的。

jint *body = (*env)->GetIntArrayElements(env, nums, 0);
函数功能:将java传入的数组本地化,即获取java传入的数组的起始位置。
(*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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值