Android jni 编程

对于整型二维数组操作:

  类型一:传入二维整型数组,返回一个整型值

  类型二:传入二维整型数组,返回一个二维整型数组

声明方法:

  1. private native int SumArray2D(int [][]ar2d);//传一个二维数组,返回一个长度
  2.  
  3. private native int [][] ModifyArray2d(int [][]ar2d);//传入一个二维数组,更改后返回一个二维数组

C语言实现

对于类型一:

  1. /**
  2. * 要点:演示对传入二维数组的访问
  3. * 功能:计算二维数组的和
  4. * NewObjectArray( env,len,jcIntArray,NULL );
  5. * 参数2:是要创建的元数个数
  6. * 参数3:是要创建的元素的类型
  7. * 参数4:是创建时的初值,可以传空
  8. */
  9. JNIEXPORT jint JNICALL Java_com_swust_array2_MainActivity_SumArray2D
  10. (JNIEnv * env, jobject obj, jobjectArray arr2D){
  11. int len = 0,length = 0;
  12. int i,j,sum=0;
  13. jarray jaIntArray;
  14. jintArray jiaTmpIntArray;
  15. jobjectArray joaReturnInt2DArray;//定义一个数组指针,到时候返回用
  16. jclass jcIntArray;
  17. jboolean jbIsCopy = JNI_FALSE;
  18.  
  19. len = (*env)->GetArrayLength( env, arr2D );//获取第一维的元数长度
  20. jaIntArray = (*env)->GetObjectArrayElement(env, arr2D, 0);//获取第0个元素 ,它是一个一维数组首地址
  21. length = (*env)->GetArrayLength( env, jaIntArray );//获取一维数组的长度
  22.  
  23. jcIntArray = (*env)->FindClass( env, "[I" );//得到一个一维数组的引用
  24. joaReturnInt2DArray = (*env)->NewObjectArray( env,len,jcIntArray,NULL );//创建len个jcIntArray.
  25.  
  26. for(i=0;i<len;i++)
  27. {
  28. jint *piSrc,*piDes;
  29.  
  30. jaIntArray = (*env)->GetObjectArrayElement(env, arr2D, i);//void*指针
  31. jiaTmpIntArray = (*env)->NewIntArray( env, length );//void*指针,元素个数是length
  32.  
  33. piSrc = (*env)->GetIntArrayElements( env,jaIntArray,&jbIsCopy );//这里还是获取首地址,得到的是jin*类型的了
  34. piDes = (*env)->GetIntArrayElements( env,jiaTmpIntArray,&jbIsCopy );//这里还是获取首地址,得到的是jin*类型的了
  35.  
  36. for(j=0;j<length;j++)
  37. {
  38. piDes[j] = piSrc[j];//把传入数组的值,赋给新创建的数组
  39. sum +=piDes[j];//通过新创建数的值。累计
  40. }
  41.  
  42. (*env)->ReleaseIntArrayElements( env,jaIntArray,piSrc,0 );//对应的释放函数
  43. (*env)->ReleaseIntArrayElements( env,jiaTmpIntArray,piDes,0 );//对应的释放函数
  44.  
  45. (*env)->SetObjectArrayElement( env, joaReturnInt2DArray, i, jiaTmpIntArray );//将新建的一维数组,做为二维数组的元素
  46. (*env)->DeleteLocalRef( env, jiaTmpIntArray );//删掉这个引用.
  47. }
  48.  
  49. (*env)->DeleteLocalRef( env, joaReturnInt2DArray );//释放整个创建的二维数组
  50.  
  51. return sum;
  52. }

对于类型2:

  1. /*
  2. * 要点:
  3. * 1:访问传入的二维数组
  4. * 2:创建一个新的二维数组
  5. * 3:修改传入的二维数组的值
  6. * 4:返回一个二维数组对象给java调用端
  7. */
  8. JNIEXPORT jobjectArray JNICALL Java_com_swust_array2_MainActivity_ModifyArray2d
  9. (JNIEnv * env, jobject obj, jobjectArray arr2D){
  10. int len = 0,length = 0;
  11. int i,j;
  12. jarray jaIntArray;
  13. jintArray jiaTmpIntArray;
  14. jobjectArray joaReturnInt2DArray;//定义一个数组指针,到时候返回用
  15. jclass jcIntArray;
  16. jboolean jbIsCopy = JNI_FALSE;
  17.  
  18. len = (*env)->GetArrayLength( env, arr2D );//获取第一维的元数长度
  19. jaIntArray = (*env)->GetObjectArrayElement(env, arr2D, 0);//获取第0个元素 ,它是一个一维数组首地址
  20. length = (*env)->GetArrayLength( env, jaIntArray );//获取一维数组的长度
  21.  
  22. jcIntArray = (*env)->FindClass( env, "[I" );//得到一个一维数组的引用
  23. joaReturnInt2DArray = (*env)->NewObjectArray( env,len,jcIntArray,NULL );//创建len个jcIntArray.
  24.  
  25. for(i=0;i<len;i++)
  26. {
  27. jint *piSrc,*piDes;
  28.  
  29. jaIntArray = (*env)->GetObjectArrayElement(env, arr2D, i);//void*指针
  30. jiaTmpIntArray = (*env)->NewIntArray( env, length );//void*指针,元素个数是length
  31.  
  32. piSrc = (*env)->GetIntArrayElements( env,jaIntArray,&jbIsCopy );//这里还是获取首地址,得到的是jin*类型的了
  33. piDes = (*env)->GetIntArrayElements( env,jiaTmpIntArray,&jbIsCopy );//这里还是获取首地址,得到的是jin*类型的了
  34.  
  35. for(j=0;j<length;j++)
  36. {
  37. piDes[j] = piSrc[j];//把传入数组的值,赋给新创建的数组
  38.           //数组元素操作区域-------start------
  39. piDes[j] = 5;//修改传入数组的值
              
  1.           //数组元素操作区域-------end------
  1. }
  2.  
  3. (*env)->ReleaseIntArrayElements( env,jaIntArray,piSrc,0 );//对应的释放函数
  4. (*env)->ReleaseIntArrayElements( env,jiaTmpIntArray,piDes,0 );//对应的释放函数
  5.  
  6. (*env)->SetObjectArrayElement( env, joaReturnInt2DArray, i, jiaTmpIntArray );//将新建的一维数组,做为二维数组的元素
  7. (*env)->DeleteLocalRef( env, jiaTmpIntArray );//删掉这个引用.
  8. }
  9.  
  10. // (*env)->DeleteLocalRef( env, joaReturnInt2DArray );//释放整个创建的二维数组
  11.  
  12. return joaReturnInt2DArray;
  13. }

在Java中调用本地方法

  1. public void click(View v){
  2. //访问二维数组,累计和,
  3. int arr2d[][] = {{1,2,3,4},{2,3,4,5,}};//new int[2][4];
  4. int sum = SumArray2D(arr2d);
  5. Log.d("wsq", "原二维数组和sum = " + sum);
  6.  
  7. //访问二维数组,并返回一个二维数组,且修改了传入二维数组的元素
  8. int arr2dA[][] = null;
  9. int sumV = 0;
  10. arr2dA = ModifyArray2d(arr2d);
  11. for(int i=0;i<2;i++)
  12. {
  13. for(int j=0;j<4;j++)
  14. { System.out.println(arr2dA[i][j]);
  15. sumV += arr2dA[i][j];
  16. }
  17. }
  18. Log.d("wsq", "更改二维整型数组后,sumV = " + sumV);
  19. }

效果:

Android jni 编程4(对基本类型二维整型数组的操作)的更多相关文章

  1. Android jni 编程3(对基本类型一维整型数组的操作)总结版

    主要学习资料:黑马程序员的NDK方法使用(生产类库so)              jni编程指南中文版(已上传至博客园) 博主文章(它使用的是VS和eclipse联合开发):http://www.c ...

  2. Android jni 编程2(对基本类型一维整型数组的操作)

    参考教程和这位博主的对一维数组的处理,主要包括以下三种类型: //传入一维数组,无返回值 public native void arrayEncode(int[] arr); //传一个一维数组和数组 ...

  3. Android jni 编程(参数的传递,成员,方法的)相互访问

    package com.test.androidjni; import android.app.Activity; import android.os.Bundle; import android.u ...

  4. 对二维数组使用指针进行操作的探索(C语言)

    /* Name: 对二维数组使用指针进行操作的探索 Copyright: Author: lingr7 Date: 01/12/18 11:55 Description: */ #include< ...

  5. 057 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 04 案例:求整型数组的数组元素的元素值累加和

    057 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 04 案例:求整型数组的数组元素的元素值累加和 本文知识点:求整型数组的数组元素的元素值累加和 案例:求整型数 ...

  6. 【转】Android JNI编程—JNI基础

    原文网址:http://www.jianshu.com/p/aba734d5b5cd 最近看到了很多关于热补的开源项目——Depoxed(阿里).AnFix(阿里).DynamicAPK(携程)等,它 ...

  7. 【转】android JNI编程 一些技巧(整理)

    原文网址:http://blog.csdn.net/linweig/article/details/5203716 本篇将介绍在JNI编程中如何传递参数和返回值. 首先要强调的是,native方法不但 ...

  8. Android JNI编程(八)——体验AS2.2.2编写Jni程序、Java调C、C调Java函数、将C代码中的Log打印至Logcat

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 不得不说在AS2.2以上的版本进行开发就一个字——爽,在2.0上使用jni出 ...

  9. Android jni 编程入门

    本文将介绍如何使用eclipse和ndk-build来编写一个基于Android4.4版本的包含有.so动态库的安卓程序. 前提是已经安装和配置好了诸如SDK,NDK等编译环境.下面开始编程! 1 程 ...

随机推荐

  1. ZOJ 3931 Exact Compression

    题目看了半小时才看懂的. 题意:首先根据给出的序列,构造出哈夫曼树,构造出来的是一棵二叉树,每个节点都有一个权值,每个节点的两个儿子只能取一个,问能否使取出来的节点权值之和刚好等于e. 这样一分析就很 ...

  2. Android获取手机唯一码

    大部分安卓手机都可以获取手机唯一码,但是有些手机的厂商却禁止了获取手机唯一码的权限,导致我们不能使用手机唯一码作为标识,但遇到一些必须要填的坑,我们也不能不填,所以使用以下方法来填坑,因此我们使用UU ...

  3. RecyclerView学习笔记

    主要方法: setLayoutManager:设置显示方式,有LinearLayoutManager(像ListView一样的纵向列表布局),有GridLayoutManager(网格布局),有Sta ...

  4. 远程开户系统开放API接口

    如今随着智能识别技术的成熟和商用,金融领域也开始逐渐试水"远程开户".从OCR身份证识别到人脸识别,到如今市场上即将出现完整的远程开户系统,除了需要成熟的技术做支撑外,还需要对市场 ...

  5. UVa 374 - Big Mod

    题目大意:计算R = BP mod M,根据模运算的性质计算. 正常计算会超时,可以用分治的思想降低时间复杂度.不过如果遇到00,结果...话说00的结果是1吗?忘了都... #include < ...

  6. mysql 常用指令

    修改表的字符集 88down voteaccepted If you want to change the table default character set and all character ...

  7. jquery $提示缺少对象$提示缺少对象

    jquery $提示缺少对象 项目中存在不同版本的jquery,有1.4也有1.2, 之前运行项目不会报错 " $提示缺少对象 ",但是我的IE9重置之后就报错,从网上找了一大堆, ...

  8. Ubuntu切换默认语言

    不得不说,从Ubuntu到Debian,又到CentOS 7,我胡汉三又回来了... 然后又装了个中文版的Ubuntu16.04LTS,不得不说,Ubuntu对中文的支持真的很好 不过,还是不太习惯, ...

  9. UVa 103 - Stacking Boxes

    题目大意:矩阵嵌套,不过维数是多维的.有两个个k维的盒子A(a1, a1...ak), B(b1, b2...bk),若能找到(a1...ak)的一个排列使得ai < bi,则盒子A可嵌套在盒子 ...

  10. linux 同步机制之complete【转】

    转自: http://blog.csdn.net/wealoong/article/details/8490654 在Linux内核中,completion是一种简单的同步机制,标志"thi ...