Jni 可以通过JNIEnv提供的方法,对传过来的Java数组进行相应的操作。它提供了两种函数:一种是操作Java的简单型数组的,另一种是操作对象类型数组的。
操作Java的简单型数组
因为速度的原因,简单类型的Java数组,会作为指向本地类型的指针暴露给本地代码调用。因此,它们能作为常规的数组存取。这个指针是指向实际的Java数组或者Java数组的拷贝的指针。另外,数组的布置保证匹配本地类型。
在C/C++中,jintArray 不能用下标对其进行直接存取,必须用到JNI中提供的接口函数进行操作。 为了存取Java简单类型的数组,就要要使用GetXXXArrayElements函数(见表),XXX代表了数组的类型。这个函数把Java数组看成参数,返回一个指向对应的本地类型的数组的指针。
函数 | Java 数组类型 | 本地类型 |
GetBooleanArrayElements | jbooleanArray | jboolean |
GetByteArrayElements | jbyteArray | jbyte |
GetCharArrayElements | jcharArray | jchar |
GetShortArrayElements | jshortArray | jshort |
GetIntArrayElements | jintArray | jint |
GetLongArrayElements | jlongArray | jlong |
GetFloatArrayElements | jfloatArray | jfloat |
GetDoubleArrayElements | jdoubleArray | jdouble |
JNIEXPORT jint JNICALL Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr) { jint *carr; carr = (*env)->GetIntArrayElements(env, arr, false); //获得Java数组arr的引用的指针 if(carr == NULL) { return 0; /* exception occurred */ } jint sum = 0; for(int i=0; i<10; i++) { sum += carr[i]; } (*env)->ReleaseIntArrayElements(env, arr, carr, 0); return sum; }
操作对象类型数组
在C/C++代码中,int类型的数组对应JNI中的jintArray,而类似字符串数组这种类型的,在Jni里对应的使用 jobjectArray 来声明,下面是存取访问 jobjectArray 的方法简介:
GetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index) array: a reference to the java.lang.Object array from which the element will be accessed. index: the array index 功能:返回对应索引值的object.返回的是一个数组元素的值。 SetObjectArrayElement(JNIEnv* env, jobjectArray array, jsize index, jobject value) array: a reference to an array whose element will be accessed. index: index of the array element to be accessed. value: the new value of the array element. 功能:用来设置对应索引元素的值。
Get/SetXXXArrayRegion函数说明
GetIntArrayRegion(array,jsize start,jsize len,*buf) array:a reference to an array whose elements are to be copied. start:the starting index of the array elements to be copied. len: the number of elements to be copied. buf: the destination buffer. 功能:把jintArray中的元素复制到buffer中。 SetIntArrayRegion(array,jsize start,jsize len,*buf) array:a reference to a primitive array to which the elements to be copied. start:the starting index in the primitive array. len:the number of elements to be copied. buf:the source buffer. 功能:把buf中的元素copy到jintArray中去。
使用SetXXXArrayRegion与GetXXXArrayRegion就是以复制的方式设置与取出Array数组中的某个值。
关于二维数组和String数组
在Jni中,二维数组和String数组都被视为object数组,因为Array和String被视为object。下面例子实现了构造并返回一个二维int数组:
JNIEXPORT jobjectArray JNICALL Java_ObjectArrayTest_initInt2DArray(JNIEnv *env, jclass cls, int size) { jobjectArray result; jclass intArrCls = (*env)->FindClass(env, "[I"); //int数组的class result = (*env)->NewObjectArray(env, size, intArrCls, NULL); //二维int数组的实例 for (int i = 0; i < size; i++) { //初始化 jint tmp[256]; /* make sure it is large enough! */ for(int j = 0; j < size; j++) { tmp[j] = i + j; } jintArray iarr = (*env)->NewIntArray(env, size); (*env)->SetIntArrayRegion(env, iarr, 0, size, tmp); //将tmp复制到iarr中 (*env)->SetObjectArrayElement(env, result, i, iarr); (*env)->DeleteLocalRef(env, iarr); } return result; }
最后得特别说明一下,当你使用对数组进行访问后,要确保调用相应的ReleaseXXXArrayElements函数,参数是对应Java数组和GetXXXArrayElements返回的指针,如果必要的话,这个释放函数会复制你做的任何变化(这样它们就反射到java数组),然后释放所有相关的资源,避免发生内存泄漏。
本文转自Zhiweiofli's Blog,转载请注明出处,谢谢。
相关推荐
在`android NDK开发1 环境搭建.docx`中,首先你需要确保已安装了Android Studio,因为NDK是与之紧密集成的。接着,你需要下载并配置NDK。在Android Studio的SDK Manager中,可以找到NDK选项进行安装。安装完成后,...
在Android开发中,NDK(Native Development Kit)允许开发者使用C和C++编写原生代码,从而提升性能和效率,特别是在处理密集计算或图形任务时。本实例关注的是如何在Android NDK环境下实现一个类似Java层的消息队列...
在Android开发中,Java语言是主要的编程工具,但有时为了追求性能优化或者利用已有的C/C++库,我们会使用Android Native Development Kit (NDK)。NDK允许开发者在Android应用中集成原生代码,实现Java与C/C++之间的...
总结来说,NDK开发的简单样例展示了如何利用JNI在Android应用中集成C/C++代码,实现Java与原生代码的双向通信。这包括数据类型的转换、函数调用以及对Java对象的访问。通过对样例的学习,开发者可以更好地理解...
Android Studio JNI_NDK开发实例是Android应用开发中的一个重要领域,涉及到Java与原生代码(C/C++)的交互。JNI(Java Native Interface)是Java平台的一部分,它允许Java代码和其他语言写的代码进行交互。NDK...
Android NDK(Native Development Kit)是Google为Android平台提供的一套工具,允许开发者使用C、C++等原生代码编写应用程序。它与Android SDK结合,提供了在Android应用中使用原生代码的能力,这对于处理高性能计算...
在Android开发中,JNI(Java Native Interface)是一种让Java代码调用本地(C/C++)代码的技术,它极大地扩展了Android应用的性能和功能。本示例程序主要讲解如何在Android Studio中通过JNI进行数组的传递,从而实现...
在Android开发中,NDK(Native Development Kit)和JNI(Java Native Interface)是两个关键工具,它们允许开发者在原生代码(如C/C++)和Java代码之间进行交互。本练习2主要关注如何在Android NDK和JNI的帮助下,从...
在本文中,我们将深入探讨如何在Free Pascal (Lazarus)环境下使用Android Native Development Kit (NDK) 进行Java Native Interface (JNI)调用。这个范例将展示字符、数值、字符数组以及数值数组在Free Pascal和...
在Android Studio中进行JNI/NDK开发,你需要: 1. **配置Gradle插件**:在build.gradle文件中启用`externalNativeBuild`,指定构建脚本,并配置支持的ABIs。 2. **设置源码目录**:创建jniLibs目录存放本地库,jni...
在Android开发中,NDK(Native ...总之,NDK开发中的C/C++调用Java方法是一项关键技能,它能让你充分利用原生代码的优势,同时解决Java层难以处理的问题。理解和熟练运用JNI,将使你的Android应用性能更上一层楼。
在Android NDK开发中,Java和C/C++之间的交互是至关重要的,它允许我们利用C/C++的高效性能处理计算密集型任务,同时保持Java的易用性和平台兼容性。以下是关于这一主题的详细解释: 1. **定义和加载 native 方法**...
掌握这些知识对进行Android NDK开发至关重要,它有助于开发者有效地处理Java与C/C++之间的数据交换,编写出性能更优的应用程序。由于JNI编程的复杂性,开发者需要仔细阅读官方文档,了解更多的JNI调用规则和高级技巧...
**NDK** (Native Development Kit) 是 Android 平台上用于开发原生 C 或 C++ 应用的一个工具包。通过 NDK,开发者能够利用 C/C++ 开发高性能的应用模块,并将其与 Java 层的应用逻辑无缝集成。 #### 二、为什么使用...
Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版 原书名:Pro Android C++ with the NDK 原出版社: Apress 作者: (美)Onur Cinar 译者: 于红 佘建伟 冯艳红 丛书名: 移动开发...
1.1.5 在Windows平台上下载并安装AndroidNDK 1.1.6 在Windows平台上下载并安装Eclipse 1.2 AppleMacOSX 1.2.1 在Mac平台上安装Xcode 1.2.2 验证Mac平台的Java开发包 1.2.3 验证Mac平台上的ApacheANT 1.2.4 验证GNU...
3. NDK开发流程: - 创建Android工程并添加NDK支持。 - 创建jni目录,编写C/C++源码。 - 使用Android.mk或CMakeLists.txt配置编译选项。 - 在Java代码中通过System.loadLibrary加载本地库。 - 定义JNI方法,并...
4. **NDK开发环境搭建**:指导如何配置Android Studio,安装NDK,设置项目构建脚本以支持原生代码编译。 5. **C/C++代码编译和链接**:讲解如何使用NDK的`ndk-build`或CMake构建系统将C/C++源码编译为可执行库。 6...