android 之 JNI 详解 (九)

3. 数组类型的传递

  和String一样,JNI为Java基本类型的数组提供了j*Array类型,比如int[]对应的就是jintArray。来看一个传递int数组的例子,

Java代码:


  1. JNIEXPORT jint JNICALL Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr){

  2. jint *carr;
  3. carr = env->GetIntArrayElements(arr, false);

  4. if(carr == NULL) {
  5. return 0;
  6. }

  7. jint sum = 0;
  8. for(int i=0; i<10; i++) {
  9. sum += carr[i];
  10. }

  11. env->ReleaseIntArrayElements(arr, carr, 0);
  12. return sum;
  13. }
复制代码


        这个例子中的GetIntArrayElements和ReleaseIntArrayElements函数就是JNI提供用于处理int数组的函数。如果试图用arr的方式去访问jintArray类型,毫无疑问会出错。JNI还提供了另一对函数GetIntArrayRegion和 ReleaseIntArrayRegion访问int数组,就不介绍了,对于其他基本类型的数组,方法类似。

  4. 二维数组和String数组

  在JNI中,二维数组和String数组都被视为object数组,因为数组和String被视为object。仍然用一个例子来说明,这次是一个二维int数组,作为返回值。

Java代码:


  1. JNIEXPORT jobjectArray JNICALL Java_ObjectArrayTest_initInt2DArray(JNIEnv *env, jclass cls, int size){

  2. jobjectArray result;

  3. jclass intArrCls = env->FindClass("[I");
  4. result = env->NewObjectArray(size, intArrCls, NULL);

  5. for (int i = 0; i < size; i++) {
  6. jint tmp[256];
  7. jintArray iarr = env->NewIntArray(size);


  8. for(int j = 0; j < size; j++) {
  9. tmp[j] = i + j;
  10. }

  11. env->SetIntArrayRegion(iarr, 0, size, tmp);
  12. env->SetObjectArrayElement(result, i, iarr);
  13. env->DeleteLocalRef(iarr);

  14. }
  15. return result;

  16. }

 

 

系列之Android 深入研究JNI(九)的帖子链接http://www.eoeandroid.com/thread-90138-1-1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值