目录
基本概念
在JNI中有很多函数某些参数都要使用签名,如下:
其中的sig就是签名;
签名是一种用参数个数和类型区分同名方法的手段,即解决方法重载问题。
其中要特别注意的是:
1. 类描述符开头的'L'与结尾的';'必须要有;
2. 数组描述符,开头的'['必须有;
3. 方法描述符规则: "(各参数描述符)返回值描述符",其中参数描述符间没有任何分隔符号。
描述符很重要,请烂熟于心. 写JNI,对于错误的签名一定要特别敏感,此时编译器帮不上忙,执行make 前仔细检查你的代码。
给出如下的几个表:
下面对这张表进行补充本补充来源于百度
1. 基本类型签名:
Java | Native | Signature |
byte | jbyte | B |
char | jchar | C |
double | jdouble | D |
float | jfloat | F |
int | jint | I |
short | jshort | S |
long | jlong | J |
boolean | jboolean | Z |
void | void | V |
2. 引用数据类型的转换
Java | Native | Signature |
所有对象 | jobject | L+classname +; |
Class | jclass | Ljava/lang/Class; |
String | jstring | Ljava/lang/String; |
Throwable | jthrowable | Ljava/lang/Throwable; |
Object[] | jobjectArray | [L+classname +; |
byte[] | jbyteArray | [B |
char[] | jcharArray | [C |
double[] | jdoubleArray | [D |
float[] | jfloatArray | [F |
int[] | jintArray | [I |
short[] | jshortArray | [S |
long[] | jlongArray | [J |
boolean[] | jbooleanArray | [Z |
栗子说明
举几个例子:
如下Java 方法:
long f (int n, String s, int[] arr);
signature: "(ILjava/lang/String;[I)J"
编码过程中,对象的签名2中方法都是可以行的。
例如: java 中 String
1.直接签名:java/lang/String
2.标准签名:Ljava/lang/String;