返回

JNI 中数组和字符串的使用艺术

Android

JNI 中的数组和字符串:揭秘数据交换的秘密

在 Java 本机接口 (JNI) 的世界中,数组和字符串是至关重要的元素,它们充当了 Java 虚拟机 (JVM) 和本机代码之间沟通的桥梁。理解这些数据类型的巧妙之处对于创建高效且无缝的交互至关重要。

JNI 中的数组

在 JNI 中,数组作为 jarray 对象处理。每个 jarray 都包含指向数组元素的指针和元素类型的信息。创建 jarray 对象的过程涉及指定数组的长度和元素类型。例如,要创建包含 10 个 int 元素的数组,可以使用以下代码:

jarray intArray = env->CreatePrimitiveArray(env, 10, env->FindClass("int"));

JNI 中的字符串

字符串在 JNI 中以 jstring 对象的形式存在。每个 jstring 都包含一个指向字符串内容的指针。创建 jstring 对象的过程涉及指定字符串的内容。例如,要创建包含 "Hello, JNI!" 字符串的 jstring,可以使用以下代码:

jstring helloString = env->NewStringUTF(env, "Hello, JNI!");

访问数组和字符串

要访问数组和字符串的元素和内容,需要使用特定的 JNI 函数:

数组:

  • GetPrimitiveArrayCritical(JNIEnv* env, jarray array, jboolean* isCopy);:返回指向数组元素的指针。
  • ReleasePrimitiveArrayCritical(JNIEnv* env, jarray array, void* carray, jint mode);:释放 GetPrimitiveArrayCritical 函数返回的指针。

字符串:

  • GetStringUTFChars(JNIEnv* env, jstring string, jboolean* isCopy);:返回指向字符串内容的指针。
  • ReleaseStringUTFChars(JNIEnv* env, jstring string, const char* chars);:释放 GetStringUTFChars 函数返回的指针。

实例演示

为了更深入地理解数组和字符串在 JNI 中的使用,让我们通过一些示例来探索:

示例 1:在 Java 中创建并填充 int 数组

public class IntArrayExample {

    public static void main(String[] args) {
        int[] intArray = new int[10];

        for (int i = 0; i < intArray.length; i++) {
            intArray[i] = i + 1;
        }
    }
}

示例 2:在 JNI 中创建并填充 int 数组

JNIEXPORT void JNICALL Java_IntArrayExample_createAndFillIntArray(JNIEnv *env, jobject obj) {
    jarray intArray = env->CreatePrimitiveArray(env, 10, env->FindClass("int"));

    jint* arrayElements = (jint*)env->GetPrimitiveArrayCritical(env, intArray, NULL);
    for (int i = 0; i < 10; i++) {
        arrayElements[i] = i + 1;
    }
    env->ReleasePrimitiveArrayCritical(env, intArray, arrayElements, 0);
}

示例 3:在 Java 中创建一个字符串

public class StringExample {

    public static void main(String[] args) {
        String str = "Hello, JNI!";
    }
}

示例 4:在 JNI 中创建一个字符串

JNIEXPORT void JNICALL Java_StringExample_createString(JNIEnv *env, jobject obj) {
    jstring str = env->NewStringUTF(env, "Hello, JNI!");
}

常见问题解答

  1. 什么是 jarrayjstring 对象?
    它们分别是 JNI 中用于表示数组和字符串的对象。

  2. 如何创建 jarray 对象?
    使用 CreatePrimitiveArray 函数,指定数组的长度和元素类型。

  3. 如何创建 jstring 对象?
    使用 NewStringUTF 函数,指定字符串的内容。

  4. 如何访问数组和字符串的元素?
    对于数组,使用 GetPrimitiveArrayCriticalReleasePrimitiveArrayCritical 函数。对于字符串,使用 GetStringUTFCharsReleaseStringUTFChars 函数。

  5. 理解 JNI 中数组和字符串的优点是什么?
    它们提供了在 Java 和本机代码之间有效传递复杂数据结构的方法。

结论

掌握 JNI 中数组和字符串的使用是开发高效本机代码的关键。通过了解这些数据类型的内部机制以及访问其元素和内容的方法,您可以创建能够跨越 Java 和本机代码边界无缝交互的应用程序。