jni访问数组
来源:互联网 发布:数据库访问 编辑:程序博客网 时间:2024/06/05 10:09
jni访问数组:
基本类型数组,引用类型数组
实现数组排序
public native void giveArray(int[] arry);c需要的数据类型
jintArray arr;流程:
将jintArray转换成C可以识别的int。通常都会进行转换
将指针当作数组使用。jint = long
jint *elemts = (*env)->GetIntArrayElements(env,arr,NULL);
>GetIntArrayElements有可能返回NULL,因为内存不够。
所以必须要进行一次判断
if(elemts == null){return}
获取数组长度
int len = (*env)->GetArrayLenght(env,arr)
复习:void为代理类型。类似于java的object,为其他所有类的基类
compare:比较函数,制定比较规则
qsort(elemts,len,sizeof(jint),compare);int compare(jint *a,jint *b){return *a - *b;}在C中大于0的bool全部是true,小于等于全为false。因此可以这样写
释放内存空间
(*env)->releaseIntArrayElements(env,arr,elemts,JNI_COMMIT);releaseIntArrayElements:
作用:释放一个缓存区。
释放可能的内存。因为GetElement函数有可能分配内存也有可能不分配
将jni修改的数据从新写回原来的内存。所以在没有调用此函数之前
原函数无法使用函数
jni中引用数据类型:jobject,jstring等
整体分三步:
创建jobjectArray。
赋值。
返回jobjectArray。
jclass jclz = (*env)->FindClass(env,"java/lang/String");
确保代码健壮性加一个判断:
if(jclz == NULL){reutrn NULL;}
创建jobjectArray:
result = (*env)->NewObjectArray(env,size,jclz,jobj);if(result == NULL){return NULL}
赋值:
for(i = 0; i <size; i++){char *c_str = (char *)malloc(256);memset(c_str,0,256);//C语言中将int转换为char,把字符串的值复制到c_strsprintf(c_str,"hello num: %d\n",i);jstring str = (*env)->NewStringUTF(env,c_str);if(str == NULL){return NULL;}//将jstring赋值给数组。从数组的第i个内容开始(*env)->setObjectArrayElement(env,result,i,str)//释放内存free(c_str)//防止野指针c_str = null}
返回string数组
return result
总结:应用类型数组和基本类型数组的区别:
创建数组的方式不同,创建数组的方式不同
区别主要在于数据类型
阅读全文
0 0
- [android jni]访问数组(JNI)
- JNI 访问数组
- jni访问数组
- 【Android】jni.h源文件/访问数组(JNI)
- JNI访问Java数组方法
- JNI数组(原始数据类型)访问示例
- JNI数组(对象数据类型)访问示例
- java jni 入门7 - 访问数组元素
- 访问数组(JNI)之申请释放
- JNI学习4——访问数组(JNI)
- JNI 学习笔记(三)-- JNI访问数组、引用、异常处理、缓存策略
- JNI学习三:数组访问(1)——简单类型数组
- android - JNI - 一维数组、二维数组的访问与使用
- android - JNI - 一维数组、二维数组的访问与使用
- android - JNI - 一维数组、二维数组的访问与使用
- JNI/NDK开发指南(四)--访问数组(基本类型数组与对象数)
- JNI/NDK开发指南(五)——访问数组(基本类型数组与对象数组)
- JNI中访问字段
- maven打包插件:appassembler
- Audio系列分析
- 搜狗 2018校招 商业基础工程—测试开发工程师练习题
- 解决vi中粘贴多行代码会产生缩进排版问题
- 怎样通过程序使一个物体运动到目标物体
- jni访问数组
- mySQL之多表查询
- android 最近任务多进程调度逻辑分析
- Redis 通信协议
- python 的日志logging模块学习
- leetcode 438. Find All Anagrams in a String
- idea手动编译jfinal项目报错:java.lang.IllegalAccessError: class sun.reflect.GeneratedConstructorAccessor10 ca
- 分类与回归树(CART,Classification And Regression Tree)
- C#学习笔记之通过http请求连接服务器