JNI数据类型

JNI数据类型分为:基本数据类型、引用数据类型、Field and Method IDs。基本数据类型即布尔类型、整型、浮点类型、Void类型;引用类型有类、对象、字符串、数组等;Field and Method IDs比较特殊,它们用于在JNI中表示Java代码中的成员和方法的ID,通过JNI函数Get到这些ID后即可以通过另外的JNI函数操作对应的成员(Field)或者方法(Method)。

JNI基本数据类型

Java Type Native Type Description
boolean jboolean unsigned 8bits
byte jbyte unsigned 8bits
char jchar signed 16bits
short jshort signed 16bits
int jint signed 32bits
long jlong signed 64bits
float jfloat 32bits
double jdouble 64bits
void void N/A

JNI_TRUE,JNI_FALSE是JNI中定义的宏,用于表示true/false。

JNI引用类型

Java Type Native Type Description
Object jobject Java对象
Class jclass
String jstring 字符串
xxxx jxxxxArray 数组

Note:Java中的Array(如byte[], char[],int[],long[],object[])类型在JNI中对应jxxxxArray,xxxx是java中数组的类型,如jbyteArray,jcharArray,jintArray,jlongArray,jobjectArray。

JNI引用类型的继承关系如下

JNI引用类型继承广西

Field and Method IDs

Field and Method IDs是基本的C指针类型:

    typedef struct _jfieldID * jfieldID;
    typedef struct _jmethodID * jmethodID;

jfieldID和jmthodID可用于获取类中的成员变量和成员函数的标识,然后通过标识来操作成员变量(读写)和成员函数(调用)。

这里展示一个基础的用法:

  jint Java_com_goodix_jni_JNI_Foo(JNIEnv *env, jobject object) {
      jfieldID fid = (*env)->GetFieldID(env, object, "speed", "I")  
      jint  speed = (*env)->GetIntField(env, object, fid);
      speed++;
      (*env)->SetIntField(env, object, fid, speed);
  }

    jint Java_com_goodix_jni_JNI_Foo1(JNIEnv *env, jobject object) {
      jmethodID mid = (*env)->GetMethodID(env, object, "speedUp", "(I)Z");  
      jboolean ok = (*env)->CallBooleanMethod(env, object, mid, 767);
  }

JNI Type Signatures 类型签名

JNI类型签名在很多地方需要用到,例如使用RegisterNatives函数注册函数时、使用GetFiledID/GetMethodID时。类型签名是JNI数据类型在JVM中的唯一标识符,使用类型签名可以区分函数形参、返回值,确定变量类型。

Type Signature Java Type
Z boolean
B byte
C char
S short
I int
J long
F float
D double
Lclass 完全限定类
[type 数组类型type[]
(arg-type)ret-type 函数类型

完全限定类如String,Integer的签名为Ljava/lang/String,Ljava/lang/Integer。函数的签名规则为圆括号内按形参顺序依次列出形参的签名列表,返回值签名紧跟圆括号后面。