JNI 开发笔记 - 数据类型

这篇博客详细介绍了JNI中的数据类型,包括基本数据类型(如布尔、整型、浮点、Void)、引用类型(类、对象、字符串、数组)以及Field和Method IDs。Field and Method IDs作为C指针,用于表示Java代码中的成员和方法ID,以便于在JNI中进行操作。此外,还提到了JNI Type Signatures的重要性,它是JNI数据类型在JVM中的唯一标识,用于函数注册和成员访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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引用类型的继承关系如下

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。函数的签名规则为圆括号内按形参顺序依次列出形参的签名列表,返回值签名紧跟圆括号后面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值