JNI 中数组和字符串的使用艺术
2023-11-29 15:18:58
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!");
}
常见问题解答
-
什么是
jarray
和jstring
对象?
它们分别是 JNI 中用于表示数组和字符串的对象。 -
如何创建
jarray
对象?
使用CreatePrimitiveArray
函数,指定数组的长度和元素类型。 -
如何创建
jstring
对象?
使用NewStringUTF
函数,指定字符串的内容。 -
如何访问数组和字符串的元素?
对于数组,使用GetPrimitiveArrayCritical
和ReleasePrimitiveArrayCritical
函数。对于字符串,使用GetStringUTFChars
和ReleaseStringUTFChars
函数。 -
理解 JNI 中数组和字符串的优点是什么?
它们提供了在 Java 和本机代码之间有效传递复杂数据结构的方法。
结论
掌握 JNI 中数组和字符串的使用是开发高效本机代码的关键。通过了解这些数据类型的内部机制以及访问其元素和内容的方法,您可以创建能够跨越 Java 和本机代码边界无缝交互的应用程序。