jni访问数组

本文介绍如何在JNI中操作Java数组,包括创建jobjectArray,对数组进行赋值和排序。详细讲解了数据类型的处理差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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_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




总结:应用类型数组和基本类型数组的区别:
创建数组的方式不同,创建数组的方式不同

区别主要在于数据类型



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值