类型转换
Java数据分为基本数据类型和引用数据类型,JNI层也是区别对待这两种类型的。下面是基本数据类型的类型转换
| Java | Native类型 | 符号类型 | 字长 |
|---|---|---|---|
| boolean | jboolean | 无符号 | 8位 |
| byte | jbyte | 无符号 | 8位 |
| char | jchar | 无符号 | 16位 |
| short | jshort | 有符号 | 16位 |
| int | jint | 有符号 | 32位 |
| long | jlong | 有符号 | 64位 |
| float | jfloat | 有符号 | 32位 |
| double | jdouble | 有符号 | 64位 |
Java引用数据类型转换
| Java引用类型 | Native类型 | Java引用类型 | Native类型 |
|---|---|---|---|
| All object | jobject | char[ ] | jcharArray |
| java.lang.Class 实例 | jclass | short[ ] | jshortArray |
| java.lang.String 实例 | jstring | int[ ] | jintArray |
| Object[ ] | jobjectArray | long[ ] | jlongArray |
| boolean[ ] | jbooleanArray | float[ ] | jfloatArray |
| byte[ ] | jbyteArray | double[ ] | jboubleArray |
| java.lang.Throwable 实例 | jthrowable |
JNI 签名
因为Java支持方法重载,所以native层调用Java层方法时需要方法的签名,这样来唯一找到目标函数。
类型标识示意表
| 类型标识 | Java 类型 | 类型标识 | Java 类型 |
|---|---|---|---|
| Z | boolean | F | float |
| B | byte | D | double |
| C | char | Ljava/lang/String | String |
| S | short | [I | int[ ] |
| I | int | [Ljava/lang/Object | Object[ ] |
| J | long |
几个函数签名例子
| 函数签名 | Java 函数 |
|---|---|
| "()Ljava/lang/String;" | String f() |
| "(ILjava/lang/Class;)J" | long f(int i, Class c) |
| "([B)V" | void f(byte[ ] bytes) |