类型转换
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) |