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. FZU 1062 洗牌问题

    首先有一个规律:当一个数字归位的时候,所有数字都会归位. 因此只需要模拟一个数字就可以了. #include<cstdio> #include<cstring> #includ ...

  2. 【转】VS2013动态库文件的创建及其使用详解

    一.VS2013动态库文件的创建 1.新建项目,win32,win32项目,输入项目名称,例如MakeDll. 2.”确定“——”下一步“,选择”DLL“选项,再点”完成“: 3.菜单栏选择”项目“— ...

  3. dom4j生成和解析xml文件

    dom4j生成和解析xml文件 要生成和解析如下格式的xml文件: <?xml version="1.0" encoding="UTF-8"?> & ...

  4. android 后台服务定时通知

    最近有个项目的要求是在程序退出之后,任然可以每天定时发通知,我们可以想下,其实就是后台开一个服务,然后时间到了就发下通知. 1.首先我们需要用到Service类. 先上代码在慢慢解释 package ...

  5. Ubuntu14.04 64bit编译u-boot-2016.07提示 Your dtc is too old, please upgrade to dtc 1.4 or newer

    Author:AP0904225版权声明:本文为博主原创文章,转载请标明出处. Ubuntu14.04 64bit环境下编译u-boot-2016.07提示如下错误: CHK include/conf ...

  6. 那就用pthon来写个跳板机吧

    1.需求 程序一: 1.后台管理 - 堡垒机上创建用户和密码(堡垒机root封装的类,UserProfile表) - .bashrc /usr/bin/python3 /data/bastion.py ...

  7. NGINX location 配置

    location表达式类型 ~ 表示执行一个正则匹配,区分大小写 ~* 表示执行一个正则匹配,不区分大小写 ^~ 表示普通字符匹配.使用前缀匹配.如果匹配成功,则不再匹配其他location. = 进 ...

  8. js原生设计模式——2面向对象编程之继承—多继承

    1.单对象克隆 <!DOCTYPE html><html lang="en"><head>    <meta charset=" ...

  9. lepus3.7 天兔监控安装手册 CentOS6.5+mysql5.6

    lepus3.7 天兔监控安装配置手册 CentOS6.5+mysql5.6 整体环境 192.168.1.250为监控机 192.168.1.248为被监控机 安装LAMP环境 [root@HE3~ ...

  10. 用Zephir编写PHP扩展

    自从NodeJS,和Golang出来后,很多人都投奔过去了.不为什么,冲着那牛X的性能.那PHP的性能什么时候能提升一下呢?要不然就会被人鄙视了.其实大牛们也深刻体会到了这些威胁,于是都在秘密开发各种 ...