JNI&NDK开发最佳实践(四):JNI数据类型及与Java数据类型的映射关系

前言

我们在.c或.cpp中实现本地方法时,我们不仅要关注方法之间的对应关系(即静态注册于动态注册),也要关注方法入参中数据类型的对应关系。

举个例子,在java文件中声明本地方法如下

public static native void test(short s, int i, long l, float f, double d, char c,
boolean z, byte b, String str, Object obj, MyClass p, int[] arr);

其在c中的对应实现如下

JNIEXPORT void JNICALL Java_com_study_jnilearn_HelloWorld_test
(JNIEnv *env, jclass cls, jshort s, jint i, jlong l, jfloat f,
jdouble d, jchar c, jboolean z, jbyte b, jstring j_str, jobject jobj1, jobject job2, jintArray j_int_arr)
{
...
}

可以发现,int变成了jint,int[]变成了jintArray。

基本数据类型的对应

JNI&NDK开发最佳实践(四):JNI数据类型及与Java数据类型的映射关系_第1张图片
基本数据类型对应.png

引用数据类型的对应

JNI&NDK开发最佳实践(四):JNI数据类型及与Java数据类型的映射关系_第2张图片
引用数据类型对应.png

jvalue类型

jvalue是一个unio(联合)类型,在C语中为了节约内存,会用联合类型变量来存储声明在联合体中的任意类型数据 。在JNI中将基本数据类型与引用类型定义在一个联合类型中,表示用jvalue定义的变量,可以存储任意JNI类型的数据,后面会介绍jvalue在JNI编程当中的应用。原型如下

typedef union jvalue {
    jboolean z;
    jbyte    b;
    jchar    c;
    jshort   s;
    jint     i;
    jlong    j;
    jfloat   f;
    jdouble  d;
    jobject  l;
} jvalue;

更多JNI&NDK系列文章,参见:
JNI&NDK开发最佳实践(一):开篇
JNI&NDK开发最佳实践(二):CMake实现调用已有C/C++文件中的本地方法
JNI&NDK开发最佳实践(三):CMake实现调用已有so库中的本地方法
JNI&NDK开发最佳实践(四):JNI数据类型及与Java数据类型的映射关系
JNI&NDK开发最佳实践(五):本地方法的静态注册与动态注册
JNI&NDK开发最佳实践(六):JNI实现本地方法时的数据类型转换
JNI&NDK开发最佳实践(七):JNI之本地方法与java互调
JNI&NDK开发最佳实践(八):JNI局部引用、全局引用和弱全局引用
JNI&NDK开发最佳实践(九):调试篇

你可能感兴趣的:(JNI&NDK开发最佳实践(四):JNI数据类型及与Java数据类型的映射关系)