Java: JNI对数组赋值并返回给Java
在JNI中对java层的数组赋值有两种方式:一是在java层创建好数组,然后传递到JNI层,由JNI层进行赋值;二是直接在JNI层创建好数组并赋值,然后返回数组到Java层。下面是两种方式的对比实现:
创建两个native方法
//传递数组,操作后,返回 public native void passArrayMethod(int[] arr); //创建指定长度数组 public native int[] createArrayMethod(int len);
生成对应的C函数
JNIEXPORT void JNICALL Java_com_test_git_jnidemo_JniUtil_JniDemo_passArrayMethod (JNIEnv *, jobject, jintArray); JNIEXPORT jintArray JNICALL Java_com_test_git_jnidemo_JniUtil_JniDemo_createArrayMethod (JNIEnv *, jobject, jint);
传递数组给JNI,修改第一个元素值,然后排序
int com(const void *a, const void *b){ return *(int *)a - *(int *)b;//升序 } JNIEXPORT void JNICALL Java_com_test_git_jnidemo_JniUtil_JniDemo_passArrayMethod (JNIEnv *env, jobject jobj, jintArray jarr){ //1.获取数组指针 jint *arr = env->GetIntArrayElements(jarr, NULL); *arr = 100; //2.获取数组长度 int len = env->GetArrayLength(jarr); //3.排序 qsort(arr, len, sizeof(jint), com); //4.释放资源 env->ReleaseIntArrayElements(jarr, arr, JNI_COMMIT); // env->ReleaseIntArrayElements(jarr, arr, JNI_ABORT); // 对于最后一个参数(如果指针指向的数组为副本时,否则该参数不起作用) // 0 copy back the content and free the elems buffer // JNI_COMMIT copy back the content but do not free the elems buffer // JNI_ABORT free the buffer without copying back the possible changes };
JNI生成数组,并返回
JNIEXPORT jintArray JNICALL Java_com_test_git_jnidemo_JniUtil_JniDemo_createArrayMethod (JNIEnv *env, jobject jobj, jint len){ //1.新建长度len数组 jintArray jarr = env->NewIntArray(len); //2.获取数组指针 jint *arr = env->GetIntArrayElements(jarr, NULL); //3.赋值 int i = 0; for(; i < len; i++){ arr[i] = i; } //4.释放资源 env->ReleaseIntArrayElements(jarr, arr, 0); //5.返回数组 return jarr; };
MainActivity中调用
int[] arr = {1, 3, 2, 6, 8, 0}; Log.i(TAG, "arr修改前: " + getArrayString(arr)); jd.passArrayMethod(arr); Log.i(TAG, "arr修改后: " + getArrayString(arr)); Log.i(TAG, "------------------------------------------"); int[] arr_new = jd.createArrayMethod(10); Log.i(TAG, "arr_new: "+ getArrayString(arr_new) );
输出结果:
09-26 17:02:29.454 994-994/com.test.git.jnidemo I/MainActivity-: arr修改前: ,1,3,2,6,8,0 09-26 17:02:29.454 994-994/com.test.git.jnidemo I/MainActivity-: arr修改后: ,0,2,3,6,8,100 09-26 17:02:29.454 994-994/com.test.git.jnidemo I/MainActivity-: ------------------------------------------ 09-26 17:02:29.454 994-994/com.test.git.jnidemo I/MainActivity-: arr_new: ,0,1,2,3,4,5,6,7,8,9
参考链接:
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
2017-11-23 View坐标系详解(getTop(),getLeft(),getX(),getY(),getLocationOnScreen(), getLocationInWindow())
2016-11-23 新浪微博客户端(34)-block的细节与本质
2016-11-23 新浪微博客户端(33)-显示头像上的认证类型
2016-11-23 新浪微博客户端(32)-设置相册图片的contentMode
2016-11-23 新浪微博客户端(31)-显示相册图片上的GIF标记