`
ujoc
  • 浏览: 49048 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

JNI 数组

阅读更多
Accessing Java Arrays

    Similar to jstring, jarray represents references to Java arrays and cannot be directly accessed in C. Our second example, IntArray.java, contains a native method that totals up the contents of an integer array. You cannot implement the native method by directly addressing the array elements:

    /* This program is illegal! */
    JNIEXPORT jint JNICALL
    Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr)
    {
      int i, sum = 0;
      for (i=0; i<10; i++)
        sum += arr[i];

    Instead, the JNI provides functions that allow you to obtain pointers to elements of integer arrays. The correct way to implement the above function is shown in the native method IntArray.c .
    Accessing Arrays of Primitive Elements

    First, obtain the length of the array by calling the JNI function GetArrayLength. Note that, unlike C arrays, Java arrays carry length information.

    JNIEXPORT jint JNICALL
    Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr)
    {
      int i, sum = 0;
      jsize len = (*env)->GetArrayLength(env, arr);

    Next, obtain a pointer to the elements of the integer array. Our example uses GetIntArrayElements to obtain this pointer. You can use normal C operations on the resulting integer array.

      jint *body = (*env)->GetIntArrayElements(env, arr, 0);
      for (i=0; i<len; i++)
        sum += body[i];

    While, in general, Java arrays may be moved by the garbage collector, the Virtual Machine guarantees that the result of GetIntArrayElements points to a nonmovable array of integers. The JNI will either "pin" down the array , or it will make a copy of the array into nonmovable memory. When the native code has finished using the array, it must call ReleaseIntArrayElements, as follows:

      (*env)->ReleaseIntArrayElements(env, arr, body, 0);
      return sum;
    }

    ReleaseIntArrayElements enables the JNI to copy back and free body if it is a copy of the original Java array, or "unpin" the Java array if it has been pinned in memory. Forgetting to call ReleaseIntArrayElements results in either pinning the array for an extended period of time, or not being able to reclaim the memory used to store the nonmovable copy of the array.

    The JNI provides a set of functions to access arrays of every primitive type, including boolean, byte, char, short, int, long, float, and double:

        * GetBooleanArrayElements accesses elements in a Java boolean array.
        * GetByteArrayElements accesses elements in a Java byte array.
        * GetCharArrayElements accesses elements in a char array.
        * GetShortArrayElements accesses elements in a short array.
        * GetIntArrayElements accesses elements in an int array.
        * GetLongArrayElements accesses elements in a long array.
        * GetFloatArrayElements accesses elements in a float array.
        * GetDoubleArrayElements accesses elements in a double array.

    Accessing a Small Number of Elements

    Note that the Get<type>ArrayElements function might result in the entire array being copied. If you are only interested in a small number of elements in a (potentially) large array, you should instead use the Get/Set<type>ArrayRegion functions. These functions allow you to access, via copying, a small set of elements in an array.
    Accessing Arrays of Objects
    The JNI provides a separate set of function to access elements of object arrays. You can get and set individual object array elements. You cannot get all the object array elements at once.

        * GetObjectArrayElement returns the object element at a given index.
        * SetObjectArrayElement updates the object element at a given index.

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Android中的JNI数组操作教程

    Android 中的 JNI 数组操作教程 Android 中的 JNI 数组操作教程主要介绍了关于 Android 中 JNI 数组操作的相关资料,通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值。 JNI 中有两种数组...

    JNI-array-arg.rar_JNI-array-arg_jni_jni 数组_jni array

    这篇文档“JNI数组参数传递.docx”将深入探讨如何在JNI中有效地传递数组,包括输入参数和返回值。 首先,理解JNI的基本结构至关重要。JNI函数通常在C/C++中定义,然后通过Java的`native`关键字声明,最后通过`...

    java_jni.rar_javbi.vcom_jni 数组

    对于多维数组,需要分别处理每个维度的数组,通常需要嵌套调用JNI数组操作函数。 5. **类型映射**:在JNI中,Java的类型需要映射为对应的本地类型。例如,Java的`int[]`映射为C的`jintArray`,`String[]`映射为`...

    jni传递对象数组

    本篇文章将深入探讨如何在JNI中传递对象数组,包括字符串、整数和小数。 首先,我们需要了解JNI的基本架构。在Java层,我们创建一个本地方法声明,这个方法将被JNI调用。在C/C++层,我们实现这个本地方法,并通过...

    hello-jni.rar_C 调用JAVA_jni 数组

    这个"hello-jni.rar"压缩包文件提供了一个实践示例,讲解如何使用C/C++调用Java,并且涉及到了JNI中数组的处理。下面我们将深入探讨相关知识点。 首先,C/C++调用Java主要通过JNI接口实现。JNI定义了一套标准的函数...

    jni 调用对象以及数组

    JNI支持各种类型的数组,包括基本类型和引用类型。对于基本类型数组,如int[],可以使用`GetIntArrayElements()`获取原始C数组,操作完成后,使用`ReleaseIntArrayElements()`释放。对于引用类型数组,如String[],...

    jni返回对象数组例子

    本示例主要探讨如何在JNI中创建并返回一个对象数组到Java层。 首先,我们需要定义一个Java类,这个类将包含JNI方法的声明。例如,我们可能有一个`Person`类,表示一个人的信息: ```java public class Person { ...

    Android工程调用jni算法(参数和返回值都为数组)

    最后,在Java层创建一个测试用例,调用`callNative`方法并打印返回的结果,以验证我们的JNI数组处理是否正确。 通过这种方式,我们可以灵活地在Java和C/C++之间传递数组数据,实现高效的数据处理。需要注意的是,...

    NDK08_JNI访问数组、引用、异常、缓存

    本主题主要探讨在JNI中如何访问数组、处理引用、处理异常以及使用缓存等核心概念。 一、JNI访问数组 在JNI中,数组分为两种类型:基本类型数组(如int[])和对象数组(如String[])。访问Java数组时,需要先通过...

    JNI学习三-简单类型数组访问

    在本教程中,我们将探讨如何使用JNI来访问和操作简单类型数组,如整型、浮点型等。 首先,让我们了解JNI的基本结构。一个JNI程序通常包含两部分:Java源代码和本地源代码。Java源代码中定义了native方法,这些方法...

    android_JNI经典大全集

    八、JNI数组处理 JNI支持对Java数组的操作,包括基本类型数组和对象数组。`GetArrayLength`获取数组长度,`GetByteArrayElements`等函数获取数组元素。 九、JNI线程 在Android中,JNI函数可能在不同的线程上下文中...

    Android Studio 数组传递 JNI 示例程序

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

    jni例子——使用int数组

    在这个“jni例子——使用int数组”的示例中,我们将深入探讨如何在Java和C/C++之间传递和操作int数组。 1. **JNI基础知识**: - JNI接口提供了Java与本地代码(如C/C++)通信的桥梁,使得开发者可以在Java应用中...

    08_15_JNI_03_方法访问_数组处理&jni引用

    08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_...

    java jni 传递结构体

    文档里描述了如何通过jni方法在java与c++代码之间传递非基本类型数据

    DELPHI开发JNI必备 jni.pas

    3. **处理Java数组**: Delphi代码可以操作Java数组,无论是基本类型还是对象数组。 4. **注册本地方法**:在Java代码中,通过JNI注册本地方法,使得Java能够调用到Delphi实现的函数。 5. **内存管理**:JNI提供了在...

    JNA调用C++动态库,传入二维数组,通过C++返回二维数组,java调用C++完整案例

    Java Native Access (JNA) 是一个非常实用的框架,它允许Java程序直接调用本地(Native)代码,无需编写JNI(Java Native Interface)代码。本案例将详细介绍如何使用JNA来调用C++动态库,特别是处理二维数组的输入和...

    Android的jni的应用C,C++(基本类型,数组,类(结构体)).源码

    这篇关于"Android的jni的应用C,C++(基本类型,数组,类(结构体)).源码"的文章和资源,提供了深入理解和实践JNI技术的基础。 首先,让我们深入了解一下JNI中的基本类型。在C/C++中,基本类型包括int、char、float、...

    Android jni调试打印char阵列的实例详解

    "Android JNI 调试打印 char 数组的实例详解" Android JNI 调试打印 char 数组的实例详解是 Android 开发中的一种常见需求,特别是在 debug 和测试阶段。在 Android 中,使用 JNI 调用 native 方法时,需要将 char...

Global site tag (gtag.js) - Google Analytics