likes
comments
collection
share

android(java-jni-c++)三者类型映射关系表

作者站长头像
站长
· 阅读数 44

Java(Android)数据类型、JNI签名、JNI类型、C++对应类型、备注说明以及JNI的基本使用方法:

Java 类型JNI 签名JNI 类型C++ 类型备注说明JNI 使用方法
byteBjbytesigned char8位有符号整数使用 (*env)->GetByteArrayElements 获取数组元素,(*env)->ReleaseByteArrayElements 释放
shortSjshortshort16位有符号整数使用 (*env)->GetShortArrayElements 获取数组元素,(*env)->ReleaseShortArrayElements 释放
intIjintint32位有符号整数使用 (*env)->GetIntArrayElements 获取数组元素,(*env)->ReleaseIntArrayElements 释放
longJjlonglong long64位有符号整数使用 (*env)->GetLongArrayElements 获取数组元素,(*env)->ReleaseLongArrayElements 释放
floatFjfloatfloat32位浮点数使用 (*env)->GetFloatArrayElements 获取数组元素,(*env)->ReleaseFloatArrayElements 释放
doubleDjdoubledouble64位浮点数使用 (*env)->GetDoubleArrayElements 获取数组元素,(*env)->ReleaseDoubleArrayElements 释放
booleanZjbooleanunsigned charint布尔值,通常0为false,非0为true使用 (*env)->GetBooleanArrayElements 获取数组元素,(*env)->ReleaseBooleanArrayElements 释放
StringLjava/lang/String;jstringconst jchar*std::string字符串类型使用 (*env)->GetStringUTFChars 获取UTF-8字符串,(*env)->ReleaseStringUTFChars 释放
ObjectL<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...ArrayElementsRelease...ArrayElements 方法

JNI 使用方法备注

  • (*env) 是一个指向 JNIEnv 的指针,它提供了JNI函数的所有接口。
  • 数组类型的JNI方法(如 GetIntArrayElements)返回的是指向数组数据的指针,而不是数组的拷贝。这意味着你可以直接操作这些数据,但必须在完成后使用相应的 Release...ArrayElements 方法释放。
  • 对于 jstring 类型,你需要使用 GetStringUTFCharsGetStringChars 方法来获取指向字符串数据的指针,并在使用完后使用 ReleaseStringUTFCharsReleaseStringChars 方法释放。
  • 对于自定义的Java对象,你需要使用 FindClass 来获取类的引用,然后使用 GetMethodIDGetFieldID 来获取方法或字段的ID,最后使用相应的 Call...MethodGet...Field 方法来调用方法或获取字段的值。
  • 在JNI中处理异常非常重要。你应该检查JNI函数调用的返回值以确保没有发生错误,并在需要时使用 ExceptionOccurredExceptionClear 来处理异常。
  • JNI编程需要小心处理内存和资源,以避免内存泄漏和其他问题。确保在使用完JNI函数后释放所有分配的资源。
转载自:https://juejin.cn/post/7369620466397741106
评论
请登录