android JNI 一维数组、二维数组的访问与使用
在JNI中访问JAVA类中的整型、浮点型、字符型的数据比较简单,举一个简单的例子,如下:
//得到类名 jclass cls = (*env)->GetObjectClass(env, obj); //得到Java类中的变量Number jfieldID fNumber = (*env)->GetStaticFieldID(env, cls, "Number", "I"); //将JNI中也就是C代码中的nJniNumber的值设置到fNumber中,其实也就将值设置给Java类中的Number (*env)->SetStaticIntField(env, cls, fNumber, nJniNumber);
但是对于一维数组和二维数组在JNI中的使用方法跟上面的有一定的差别,也有点麻烦,下面我们就看看怎么使用。
在网上找到的一段代码,基上显示了JNI中二维数组的使用,觉得不错,我又将代码进行了一些整理,如下:
Java_com_array_arrayTest_arrayUse( JNIEnv* env,jobject thiz,jobjectArray arrayData) { jint i,j; int row = (*env)->GetArrayLength(env, arrayData);//获得行数 jarray myarray = ((*env)->GetObjectArrayElement(env, arrayData, 0)); int col =(*env)->GetArrayLength(env, myarray); //获得列数 jint jniData[row][col]; for (i = 0; i < row; i++){ myarray = ((*env)->GetObjectArrayElement(env, arrayData, i)); jint *coldata = (*env)->GetIntArrayElements(env, (jintArray)myarray, 0 ); for (j=0; j<col; j++) { jniData [i] [j] = coldata[j]; //取出JAVA类中arrayData的数据,并赋值给JNI中的数组 } (*env)->ReleaseIntArrayElements(env, (jintArray)myarray, coldata,0 ); } }
其中,arrayData是通过参数将Java中定义的一个二维数组int[][] testArray = new int[50][50]传递过来的;
一、在上面例子中只是得到数组中的数据,那么如何设置数组中的数据呢? 我们来看一下下面的代码:
Java_com_array_arrayTest_arrayUse( JNIEnv* env,jobject thiz,jobjectArray arrayData) { jin i,j; jint count = 10; jint jniData[10][10]; for(i=0; i < count; i++) { for(j = 0 ; i < count; j++ { jniData[i][j] = i*(i+j); } } for (i = 0; i < row; i++){ { //得到数组的首地址 jarray myarray = ((*env)->GetObjectArrayElement(env, arrayData, i)); //将jni数组的count个元素给myarray数组 (*env)->SetIntArrayRegion(env, myarray, 0, count,jniData[i]); (*env)->ReleaseIntArrayElements(env, (jintArray)myarray, coldata,0 ); } }
如果arrayData是一维数组的话,将上面的for循环去掉就可以了。
二、一维的字符串数组怎么设置数据呢?我们来看下面的代码:
Java_com_array_arrayTest_arrayUse( JNIEnv* env,jobject thiz,jobjectArray arrayStringData) { jin i; char temp[100]; jint count = (*env)->GetArrayLength(env, arrayStringData); for (i = 0; i < count; i++){ { memset(temp,0,100); sprintf(temp,"str:%d",i); //得到一个jstring的数据 jstring str = (*env)->NewStringUTF(env, temp); //将str设置给arrayStringData的第i个元素。 (*env)->SetObjectArrayElement(env, arrayStringData, i, str); } }
其中,arrayStringData是通过参将Java中定义的一个一维数组String[] testArray = new String[50]传递过的;
三、二维的字符串数据怎么设置数据?请看下面的代码:
Java_com_array_arrayTest_arrayUse( JNIEnv* env,jobject thiz,jobjectArray arrayStringData) { jin i,j; char temp[100]; jint count = (*env)->GetArrayLength(env, arrayStringData); for (i = 0; i < count; i++){ { //得到一行数据 jarray myarray = ((*env)->GetObjectArrayElement(env, arrayStringData, i)); jint count1 = (*env)->GetArrayLength(env,myarray); for(j=0; j < count1; j++) { memset(temp,0,100); sprintf(temp,"str:%d",i*(i+j)); //得到一个jstring的数据 jstring str = (*env)->NewStringUTF(env, temp); //将str设置给arrayStringData的第j个元素。 (*env)->SetObjectArrayElement(env, myarray, j, str); } } }
其中,arrayStringData是通过参数将Java中定义的一个二维数组String[][] testArray = new String[50][50]传递过的。
四、上面的访问数组的方法都是通过参数传递的方式实现的,如何不通过参数传递在JNI中直接得到数组进行操作呢?
我在网上查找相关的资料和文章,也有这方面的介绍,我在使用他们的方法时,程序总是出错,不知道什么原因,因此,至今仍然没有搞明白怎样才能够不通过参数传递的方式直接访问JAVA中的数组。
我在论坛中发过贴子,也没有找到相应的方法,论坛的贴子如下:
http://topic.csdn.net/u/20120315/10/f956498c-ed93-4d4f-bfb2-cc1719de61d7.html
如果你有什么好的见意的话,可以给我私信或留言,谢谢。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!