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_str
sprintf(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
总结:应用类型数组和基本类型数组的区别:
创建数组的方式不同,创建数组的方式不同
区别主要在于数据类型