JNI学习(4)(我是菜鸟)-JNI类型签名

所有内容为记录学习过程,不是大牛尽情谅解。所有分析都参考深入理解Android 卷一


先看一下动态注册中的代码

JNI学习(4)(我是菜鸟)-JNI类型签名_第1张图片

现在看processFile 方法 一直都没明白后面的那一长串字符串


不过 通过昨天的 native方法和JNI方法映射了解到了 “/”似乎是可以看做”.()

所以上面的那一串字符串 可以看做

“(Ljava.lang.String;Ljava.lang.String;Landroid.media.MediaScannerClient;)V”

由前面的学习知道这一串字符串叫做签名,由参数类型 String 和返回值 V(void)

至于为什么需要这个签名呢,个人认为虽然函数名映射过来了,但是参数还有问题。

正确的答案:

Java支持函数重载,也就是说,可以定义同名但不同参数的函数,所以仅仅根据函数名,没有办法找到具体的函数,为了解决这个问题,JNI技术中就将参数类型和返回值类型的组合,作为了一个函数签名的信息,有了签名信息,和函数名,就能很顺利的找到java中的函数了。

JNI规范定义的函数签名信息

(参数1类型标示;参数2类型标示......)返回值类型标示

MediaScanner.java中定义的 processFile

private native void processFile(String path,String mimeType,MediaScannerClient client)

对应的JNI寒素签名就是


当参数为引用类型的时候,参数类型的标示的格式为”L包名” 其中包名的.(点)换成”/”看上面的例子 就不多解释了。

类型标示

Java类型

类型标示

Java类型

Z

boolean

F

float

B

byte

D

double

C

char

L/java/lang/String

String

S

short

[I

Int[]

I

int

[L/java/lang/object

Object[]

J

long


上面表格中列出了常用的类型标示,如果java类型是数组,则标示中会出现一个“[

另外引用类型(除基本类型的数组外)的标识最后都有一个”;”分毫

虽然函数签名信息很容易写错,但是Java提供一个叫javap的工具,能帮助生成函数或变量的签名洗洗,它的用法

javap -s -p xxx

Xxx为编译后的class文件,s标识输出内部数据类型的签名信息,p表示打印所有的函数和成员的签名信息,默认只会打印public成员和函数的签名信息

你可能感兴趣的:(java,jni)