您的位置:首页 > 其它

JNI 开发笔记 - 数据类型

2016-04-10 17:28 369 查看

JNI数据类型

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

JNI基本数据类型

Java TypeNative TypeDescription
booleanjbooleanunsigned 8bits
bytejbyteunsigned 8bits
charjcharsigned 16bits
shortjshortsigned 16bits
intjintsigned 32bits
longjlongsigned 64bits
floatjfloat32bits
doublejdouble64bits
voidvoidN/A
JNI_TRUE,JNI_FALSE是JNI中定义的宏,用于表示true/false。

JNI引用类型

Java TypeNative TypeDescription
ObjectjobjectJava对象
Classjclass
Stringjstring字符串
xxxxjxxxxArray数组
Note:Java中的Array(如byte[], char[],int[],long[],object[])类型在JNI中对应jxxxxArray,xxxx是java中数组的类型,如jbyteArray,jcharArray,jintArray,jlongArray,jobjectArray。

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 SignatureJava Type
Zboolean
Bbyte
Cchar
Sshort
Iint
Jlong
Ffloat
Ddouble
Lclass完全限定类
[type数组类型type[]
(arg-type)ret-type函数类型
完全限定类如String,Integer的签名为Ljava/lang/String,Ljava/lang/Integer。函数的签名规则为圆括号内按形参顺序依次列出形参的签名列表,返回值签名紧跟圆括号后面。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: