-
基本数据类型:
- Java 中的
int
对应 JNI 中的jint
。 - Java 中的
boolean
对应 JNI 中的jboolean
。 - Java 中的
float
对应 JNI 中的jfloat
。 - Java 中的
double
对应 JNI 中的jdouble
。 - Java 中的
byte
对应 JNI 中的jbyte
。 - Java 中的
short
对应 JNI 中的jshort
。 - Java 中的
long
对应 JNI 中的jlong
。 - Java 中的
char
对应 JNI 中的jchar
。
- Java 中的
-
对象类型:
- Java 中的
Object
对应 JNI 中的jobject
。 - Java 中的
Class
对应 JNI 中的jclass
。 - Java 中的数组对应 JNI 中的相应类型,比如
int[]
对应jintArray
。
- Java 中的
-
字符串类型:
- Java 中的
String
对应 JNI 中的jstring
。
- Java 中的
-
其他类型:
- Java 中的
void
对应 JNI 中的void
。 - Java 中的
void*
或者Object
指针对应 JNI 中的jlong
或者intptr_t
。 - Java 中的枚举类型等可通过整数表示,在 JNI 中直接使用对应的整数类型。
- Java 中的
- 例如以下的举例
#include <jni.h>
#include <stdio.h>
JNIEXPORT void JNICALL Java_com_ichtj_test_JNIExample_callNativeMethod(JNIEnv *env, jobject obj, jint intValue, jfloat floatValue, jdouble doubleValue, jboolean booleanValue, jchar charValue, jstring stringValue, jintArray intArray) {
// 将 Java 中的 int 类型转换为 JNI 中的 jint 类型
printf("Received int value in JNI: %d\n", intValue);
// 将 Java 中的 float 类型转换为 JNI 中的 jfloat 类型
printf("Received float value in JNI: %f\n", floatValue);
// 将 Java 中的 double 类型转换为 JNI 中的 jdouble 类型
printf("Received double value in JNI: %lf\n", doubleValue);
// 将 Java 中的 boolean 类型转换为 JNI 中的 jboolean 类型
if (booleanValue) {
printf("Received boolean value in JNI: true\n");
} else {
printf("Received boolean value in JNI: false\n");
}
// 将 Java 中的 char 类型转换为 JNI 中的 jchar 类型
printf("Received char value in JNI: %c\n", charValue);
// 将 Java 中的 String 类型转换为 JNI 中的 jstring 类型
const char *str = (*env)->GetStringUTFChars(env, stringValue, NULL);
printf("Received string value in JNI: %s\n", str);
(*env)->ReleaseStringUTFChars(env, stringValue, str);
// 将 Java 中的 int[] 类型转换为 JNI 中的 jintArray 类型
jint *arrayElements = (*env)->GetIntArrayElements(env, intArray, NULL);
jsize length = (*env)->GetArrayLength(env, intArray);
printf("Received int array values in JNI: ");
for (int i = 0; i < length; i++) {
printf("%d ", arrayElements[i]);
}
printf("\n");
(*env)->ReleaseIntArrayElements(env, intArray, arrayElements, 0);
}