`
zhiweiofli
  • 浏览: 515027 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Android NDK开发之数组类型的操作

阅读更多

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,转载请注明出处,谢谢。

 

0
0
分享到:
评论

相关推荐

    android ndk开发(从环境搭建到运行demo全教程)

    在`android NDK开发1 环境搭建.docx`中,首先你需要确保已安装了Android Studio,因为NDK是与之紧密集成的。接着,你需要下载并配置NDK。在Android Studio的SDK Manager中,可以找到NDK选项进行安装。安装完成后,...

    android NDK实现的Hanlder-消息队列-native多线程实例

    在Android开发中,NDK(Native Development Kit)允许开发者使用C和C++编写原生代码,从而提升性能和效率,特别是在处理密集计算或图形任务时。本实例关注的是如何在Android NDK环境下实现一个类似Java层的消息队列...

    Android NDK底层和java代码相互传值调用(实用经典Demo)

    在Android开发中,Java语言是主要的编程工具,但有时为了追求性能优化或者利用已有的C/C++库,我们会使用Android Native Development Kit (NDK)。NDK允许开发者在Android应用中集成原生代码,实现Java与C/C++之间的...

    ndk开发的简单样例

    总结来说,NDK开发的简单样例展示了如何利用JNI在Android应用中集成C/C++代码,实现Java与原生代码的双向通信。这包括数据类型的转换、函数调用以及对Java对象的访问。通过对样例的学习,开发者可以更好地理解...

    Android Studio JNI_NDK开发实例

    Android Studio JNI_NDK开发实例是Android应用开发中的一个重要领域,涉及到Java与原生代码(C/C++)的交互。JNI(Java Native Interface)是Java平台的一部分,它允许Java代码和其他语言写的代码进行交互。NDK...

    android ndk 代码实例

    Android NDK(Native Development Kit)是Google为Android平台提供的一套工具,允许开发者使用C、C++等原生代码编写应用程序。它与Android SDK结合,提供了在Android应用中使用原生代码的能力,这对于处理高性能计算...

    Android Studio 数组传递 JNI 示例程序

    在Android开发中,JNI(Java Native Interface)是一种让Java代码调用本地(C/C++)代码的技术,它极大地扩展了Android应用的性能和功能。本示例程序主要讲解如何在Android Studio中通过JNI进行数组的传递,从而实现...

    Android NDK+JNI 练习2

    在Android开发中,NDK(Native Development Kit)和JNI(Java Native Interface)是两个关键工具,它们允许开发者在原生代码(如C/C++)和Java代码之间进行交互。本练习2主要关注如何在Android NDK和JNI的帮助下,从...

    free pascal (lazarus) 版的 android NDK (JNI)调用范例、数据类型转换示例

    在本文中,我们将深入探讨如何在Free Pascal (Lazarus)环境下使用Android Native Development Kit (NDK) 进行Java Native Interface (JNI)调用。这个范例将展示字符、数值、字符数组以及数值数组在Free Pascal和...

    Android Studio JNI/NDK 编程

    在Android Studio中进行JNI/NDK开发,你需要: 1. **配置Gradle插件**:在build.gradle文件中启用`externalNativeBuild`,指定构建脚本,并配置支持的ABIs。 2. **设置源码目录**:创建jniLibs目录存放本地库,jni...

    NDK开发之C语言调用Java构造方法、父类方法、返回中文字符串乱码问题案例

    在Android开发中,NDK(Native ...总之,NDK开发中的C/C++调用Java方法是一项关键技能,它能让你充分利用原生代码的优势,同时解决Java层难以处理的问题。理解和熟练运用JNI,将使你的Android应用性能更上一层楼。

    ANDROIDNDK开发三:JAVA和CC交互宣贯.pdf

    在Android NDK开发中,Java和C/C++之间的交互是至关重要的,它允许我们利用C/C++的高效性能处理计算密集型任务,同时保持Java的易用性和平台兼容性。以下是关于这一主题的详细解释: 1. **定义和加载 native 方法**...

    浅析Android NDK编程中参数的传递.pdf

    掌握这些知识对进行Android NDK开发至关重要,它有助于开发者有效地处理Java与C/C++之间的数据交换,编写出性能更优的应用程序。由于JNI编程的复杂性,开发者需要仔细阅读官方文档,了解更多的JNI调用规则和高级技巧...

    Android NDK使用

    **NDK** (Native Development Kit) 是 Android 平台上用于开发原生 C 或 C++ 应用的一个工具包。通过 NDK,开发者能够利用 C/C++ 开发高性能的应用模块,并将其与 Java 层的应用逻辑无缝集成。 #### 二、为什么使用...

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版 原书名:Pro Android C++ with the NDK 原出版社: Apress 作者: (美)Onur Cinar 译者: 于红 佘建伟 冯艳红 丛书名: 移动开发...

    pro_android_cpp_with_the_ndk.pdf

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

    NDK编程JNI基本操作编程入门教案

    3. NDK开发流程: - 创建Android工程并添加NDK支持。 - 创建jni目录,编写C/C++源码。 - 使用Android.mk或CMakeLists.txt配置编译选项。 - 在Java代码中通过System.loadLibrary加载本地库。 - 定义JNI方法,并...

    jni、ndk绝命讲解

    4. **NDK开发环境搭建**:指导如何配置Android Studio,安装NDK,设置项目构建脚本以支持原生代码编译。 5. **C/C++代码编译和链接**:讲解如何使用NDK的`ndk-build`或CMake构建系统将C/C++源码编译为可执行库。 6...

Global site tag (gtag.js) - Google Analytics