Android jni 编程

对于整型二维数组操作:

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

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

声明方法:

private native int SumArray2D(int [][]ar2d);//传一个二维数组,返回一个长度 

private native int [][] ModifyArray2d(int [][]ar2d);//传入一个二维数组,更改后返回一个二维数组

C语言实现

对于类型一:

/**
* 要点:演示对传入二维数组的访问
* 功能:计算二维数组的和
* NewObjectArray( env,len,jcIntArray,NULL );
* 参数2:是要创建的元数个数
* 参数3:是要创建的元素的类型
* 参数4:是创建时的初值,可以传空
*/
JNIEXPORT jint JNICALL Java_com_swust_array2_MainActivity_SumArray2D
(JNIEnv * env, jobject obj, jobjectArray arr2D){
int len = 0,length = 0;
int i,j,sum=0;
jarray jaIntArray;
jintArray jiaTmpIntArray;
jobjectArray joaReturnInt2DArray;//定义一个数组指针,到时候返回用
jclass jcIntArray;
jboolean jbIsCopy = JNI_FALSE; len = (*env)->GetArrayLength( env, arr2D );//获取第一维的元数长度
jaIntArray = (*env)->GetObjectArrayElement(env, arr2D, 0);//获取第0个元素 ,它是一个一维数组首地址
length = (*env)->GetArrayLength( env, jaIntArray );//获取一维数组的长度 jcIntArray = (*env)->FindClass( env, "[I" );//得到一个一维数组的引用
joaReturnInt2DArray = (*env)->NewObjectArray( env,len,jcIntArray,NULL );//创建len个jcIntArray. for(i=0;i<len;i++)
{
jint *piSrc,*piDes; jaIntArray = (*env)->GetObjectArrayElement(env, arr2D, i);//void*指针
jiaTmpIntArray = (*env)->NewIntArray( env, length );//void*指针,元素个数是length piSrc = (*env)->GetIntArrayElements( env,jaIntArray,&jbIsCopy );//这里还是获取首地址,得到的是jin*类型的了
piDes = (*env)->GetIntArrayElements( env,jiaTmpIntArray,&jbIsCopy );//这里还是获取首地址,得到的是jin*类型的了 for(j=0;j<length;j++)
{
piDes[j] = piSrc[j];//把传入数组的值,赋给新创建的数组
sum +=piDes[j];//通过新创建数的值。累计
} (*env)->ReleaseIntArrayElements( env,jaIntArray,piSrc,0 );//对应的释放函数
(*env)->ReleaseIntArrayElements( env,jiaTmpIntArray,piDes,0 );//对应的释放函数 (*env)->SetObjectArrayElement( env, joaReturnInt2DArray, i, jiaTmpIntArray );//将新建的一维数组,做为二维数组的元素
(*env)->DeleteLocalRef( env, jiaTmpIntArray );//删掉这个引用.
} (*env)->DeleteLocalRef( env, joaReturnInt2DArray );//释放整个创建的二维数组 return sum;
}

对于类型2:

/*
* 要点:
* 1:访问传入的二维数组
* 2:创建一个新的二维数组
* 3:修改传入的二维数组的值
* 4:返回一个二维数组对象给java调用端
*/
JNIEXPORT jobjectArray JNICALL Java_com_swust_array2_MainActivity_ModifyArray2d
(JNIEnv * env, jobject obj, jobjectArray arr2D){
int len = 0,length = 0;
int i,j;
jarray jaIntArray;
jintArray jiaTmpIntArray;
jobjectArray joaReturnInt2DArray;//定义一个数组指针,到时候返回用
jclass jcIntArray;
jboolean jbIsCopy = JNI_FALSE; len = (*env)->GetArrayLength( env, arr2D );//获取第一维的元数长度
jaIntArray = (*env)->GetObjectArrayElement(env, arr2D, 0);//获取第0个元素 ,它是一个一维数组首地址
length = (*env)->GetArrayLength( env, jaIntArray );//获取一维数组的长度 jcIntArray = (*env)->FindClass( env, "[I" );//得到一个一维数组的引用
joaReturnInt2DArray = (*env)->NewObjectArray( env,len,jcIntArray,NULL );//创建len个jcIntArray. for(i=0;i<len;i++)
{
jint *piSrc,*piDes; jaIntArray = (*env)->GetObjectArrayElement(env, arr2D, i);//void*指针
jiaTmpIntArray = (*env)->NewIntArray( env, length );//void*指针,元素个数是length piSrc = (*env)->GetIntArrayElements( env,jaIntArray,&jbIsCopy );//这里还是获取首地址,得到的是jin*类型的了
piDes = (*env)->GetIntArrayElements( env,jiaTmpIntArray,&jbIsCopy );//这里还是获取首地址,得到的是jin*类型的了 for(j=0;j<length;j++)
{
piDes[j] = piSrc[j];//把传入数组的值,赋给新创建的数组
          //数组元素操作区域-------start------
piDes[j] = 5;//修改传入数组的值
          
          //数组元素操作区域-------end------
                }

                (*env)->ReleaseIntArrayElements( env,jaIntArray,piSrc,0 );//对应的释放函数
(*env)->ReleaseIntArrayElements( env,jiaTmpIntArray,piDes,0 );//对应的释放函数 (*env)->SetObjectArrayElement( env, joaReturnInt2DArray, i, jiaTmpIntArray );//将新建的一维数组,做为二维数组的元素
(*env)->DeleteLocalRef( env, jiaTmpIntArray );//删掉这个引用.
} // (*env)->DeleteLocalRef( env, joaReturnInt2DArray );//释放整个创建的二维数组 return joaReturnInt2DArray;
}

在Java中调用本地方法

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

效果:

最新文章

  1. .NET开发人员必看:提高ASP.NET Web应用性能的24种方法和技巧
  2. 关于 Mybatis 的Invalid bound statement (not found):错误
  3. 修改windows系统文件权限
  4. 阻塞队列LinkedBlockingQueue和并发队列ConcurrentLinkedQueue
  5. 【递推】BZOJ 4300:绝世好题
  6. Error starting static Resources java.lang.IllegalArgumentException: Document base D:\Program Files\apache-tomcat-xxx\webapps\xxx does not exist or is not a readable directory
  7. 转载:MyEclipse中防止代码格式化时出现换行的情况的设置
  8. 【线段树求最靠前】【HDU2795】【Billboard】
  9. poj-3899-The Lucky Numbers 模拟+数学
  10. 03(3) 基于GMM-HMM的SR基础
  11. MySQL 查询最近几天的记录 最近7天的记录 本周内的记录
  12. Java反射之修改常量值
  13. QT:创建一个widget,包含源文件,头文件,以及ui文件
  14. &lt;转&gt;jmeter(七)定时器
  15. python中lambda的用法
  16. 使用generator生成dao、mapping和model
  17. ADO.NET获取数据(DataSet)同时获取表的架构
  18. 6.15-初识JSP、javaweb
  19. Hbase-0.96.2全然分布式安装部署
  20. {{ }} 和ng-bind

热门文章

  1. Spark 的combineByKey函数
  2. C#基础之操作字符串的方法
  3. Datetime.GetDateTimeFormats()的集合
  4. APP被苹果APPStore拒绝的各种原因 分类: ios相关 app相关 2015-06-25 17:27 200人阅读 评论(0) 收藏
  5. STL中map用法
  6. IOS开发-UI学习-UINavigationController(导航控制器)的使用
  7. Jenkins SSH timeout
  8. Python3基础 闭包 简单示例
  9. 华为AR1220新机试用
  10. 读取SQLServer数据库存储过程列表及参数信息