之前也遇到过
Ljava/lang/String;@123403f
这种描述语言,但具体没有了解过。今天就详细说说这个JNI
字段描述符。
个人对JNI
理解下个定义:JNI
是对程序运行时对参数类型为:基本数据类型,数组,集合,对象等作为参数时的参数类型描述。是该参数的一个编码,估计和其hash值有关系吧。语法格式以Object
数组为例:以大写的”L
”开头,以”;
”结尾,中间是用”/
” 隔开的包及类名
下面从具体实例中理解过更好些:
-
[Ljava/lang/String;@120243f
解析
[
:一个 ‘【
’ 表示为这个参数是个一维数组
Ljava/lang/String
:表示数组类型为String
-
[Ljava/lang/Object;@120243f
[
:一个 ‘【
’ 表示为这个参数是个一维数组
Ljava/lang/Object
:表示数组类型为Object
-
[Ijava/lang/Integer;@120243f
[
:一个 ‘【’ 表示为这个参数是个一维数组
Ijava/lang/Integer
:表示数组类型为Integer
-
[[Ljava/lang/Object;@120243f
[ [
:一个 ‘【【
’ 表示为这个参数是个二维数组
Ljava/lang/Object
:表示数组类型为Object
-
Ljava/lang/String;
无‘【
’: 表示为基本数据类型
Ljava/lang/String
表示数据类型为String
-
当一个函数不需要返回参数类型时,就使用”
V
”来表示。
“()Ljava/lang/String;
”就是表示String f();
“(ILjava/lang/Class;)J
”就是表示long f(int i, Class c);
“([B)V
”就是表示void String(byte[] bytes);
下面是具体的对照表:
“([Ljava/lang/String;)V
” 它是一种对函数返回值和参数的编码。这种编码叫做JNI字段描述符(JavaNative Interface FieldDescriptors
)。一个数组int[]
,就需要表示为这样"[I
"。如果多个数组double[][][]
就需要表示为这样 “[[[D
”。也就是说每一个方括号开始,就表示一个数组维数。多个方框后面,就是数组 的类型。
如果以一个L
开头的描述符,就是类描述符,它后紧跟着类的字符串,然后分号“;
”结束。
比如"Ljava/lang/String;
"就是表示类型String
;
"[I
"就是表示int[]
;
"[Ljava/lang/Object;
"就是表示Object[]
。
JNI
方法描述符,主要就是在括号里放置参数,在括号后面放置返回类型,如下:
(参数描述符)返回类型
当一个函数不需要返回参数类型时,就使用”V
”来表示。
比如"()Ljava/lang/String;
"就是表示String f()
;
"(ILjava/lang/Class;)J
"就是表示long f(int i, Class c)
;
"([B)V
"就是表示void String(byte[] bytes)
;
Java 类型 | 符号 |
---|---|
Boolean | Z |
Byte | B |
Char | C |
Short | S |
Int | I |
Long | J |
Float | F |
Double | D |
Void | V |
objects对象 | 以"L “开头,以”; “结尾,中间是用”/ " 隔开的包及类名。比如:Ljava/lang/String; 如果是嵌套类,则用$ 来表示嵌套。例如 “(Ljava/lang/String;Landroid/os/FileUtils$FileStatus;)Z ” |
另外数组类型的简写,则用"[
"加上如表A
所示的对应类型的简写形式进行表示就可以了,
比如:[I
表示 int []
;[L/java/lang/objects;
表示Objects[]
,另外。引用类型(除基本类型的数组外)的标示最后都有个";
"
例如:
“()V
” 就表示void Func()
;
“(II)V
” 表示 void Func(int, int)
;
“(Ljava/lang/String;Ljava/lang/String;)I
”.表示 int Func(String,String)