jni访问数组

来源:互联网 发布:数据库访问 编辑:程序博客网 时间:2024/06/05 10:09

jni访问数组:


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
原创粉丝点击