android(java-jni-c++)三者类型映射关系表
Java(Android)数据类型、JNI签名、JNI类型、C++对应类型、备注说明以及JNI的基本使用方法:
Java 类型 | JNI 签名 | JNI 类型 | C++ 类型 | 备注说明 | JNI 使用方法 |
---|---|---|---|---|---|
byte | B | jbyte | signed char | 8位有符号整数 | 使用 (*env)->GetByteArrayElements 获取数组元素,(*env)->ReleaseByteArrayElements 释放 |
short | S | jshort | short | 16位有符号整数 | 使用 (*env)->GetShortArrayElements 获取数组元素,(*env)->ReleaseShortArrayElements 释放 |
int | I | jint | int | 32位有符号整数 | 使用 (*env)->GetIntArrayElements 获取数组元素,(*env)->ReleaseIntArrayElements 释放 |
long | J | jlong | long long | 64位有符号整数 | 使用 (*env)->GetLongArrayElements 获取数组元素,(*env)->ReleaseLongArrayElements 释放 |
float | F | jfloat | float | 32位浮点数 | 使用 (*env)->GetFloatArrayElements 获取数组元素,(*env)->ReleaseFloatArrayElements 释放 |
double | D | jdouble | double | 64位浮点数 | 使用 (*env)->GetDoubleArrayElements 获取数组元素,(*env)->ReleaseDoubleArrayElements 释放 |
boolean | Z | jboolean | unsigned char 或 int | 布尔值,通常0为false,非0为true | 使用 (*env)->GetBooleanArrayElements 获取数组元素,(*env)->ReleaseBooleanArrayElements 释放 |
String | Ljava/lang/String; | jstring | const jchar* 或 std::string | 字符串类型 | 使用 (*env)->GetStringUTFChars 获取UTF-8字符串,(*env)->ReleaseStringUTFChars 释放 |
Object | L<classname>; | jobject | 自定义C++类或结构体指针 | 自定义Java对象 | 使用 (*env)->FindClass 获取类引用,(*env)->GetMethodID 获取方法ID,(*env)->CallVoidMethod 等调用方法 |
Object[] | [L<classname>; | jobjectArray | 自定义C++类或结构体指针数组 | 自定义Java对象数组 | 使用 (*env)->GetObjectArrayElement 获取数组元素,注意处理 jobject |
byte[] , short[] , int[] 等 | [<type>; | 对应的JNI数组类型 | 对应的C++数组类型 | 基本类型数组 | 使用对应的 Get...ArrayElements 和 Release...ArrayElements 方法 |
JNI 使用方法备注:
(*env)
是一个指向JNIEnv
的指针,它提供了JNI函数的所有接口。- 数组类型的JNI方法(如
GetIntArrayElements
)返回的是指向数组数据的指针,而不是数组的拷贝。这意味着你可以直接操作这些数据,但必须在完成后使用相应的Release...ArrayElements
方法释放。 - 对于
jstring
类型,你需要使用GetStringUTFChars
或GetStringChars
方法来获取指向字符串数据的指针,并在使用完后使用ReleaseStringUTFChars
或ReleaseStringChars
方法释放。 - 对于自定义的Java对象,你需要使用
FindClass
来获取类的引用,然后使用GetMethodID
或GetFieldID
来获取方法或字段的ID,最后使用相应的Call...Method
或Get...Field
方法来调用方法或获取字段的值。 - 在JNI中处理异常非常重要。你应该检查JNI函数调用的返回值以确保没有发生错误,并在需要时使用
ExceptionOccurred
和ExceptionClear
来处理异常。 - JNI编程需要小心处理内存和资源,以避免内存泄漏和其他问题。确保在使用完JNI函数后释放所有分配的资源。
转载自:https://juejin.cn/post/7369620466397741106