Android Jni分析2

sancaiodm Android应用 2023-07-31 1134 0


JVM查找Native方法有两种方式:

静态注册:按照JNI规范的命名规则进行查找。

                java_类路径_方法名(路径用下划线分隔)

动态注册:调用JNIEnv提供的RegisterNatives函数,将本地函数注册到JVM中。



静态注册:

    我们先来了解JNI中的属性描述符和函数签名的概念。

    JNI属性描述符也就是变量类型在JNI中的表示方式,它是由属性的声明类型决定的。例如使用"I"表示int属性,使用"F"表示float属性,使用"D"表示double属性,

使用"Z"表示boolean属性等。对于引用各类型属性的描述符,比如java.lang.String,需要以字母"L"开头, 解析来是JNI类描述符并使用一个分号结束,Java中完整类名中的"."被"/"替换掉了。

因此,对于java.lang.String类型需要使用以下形式的属性描述符: Ljava/lang/String;。

数组类型的描述符由"["以及数组元素类型的描述符组成,例如,[I表示整型数组的属性描述符,以此类推。

    我们可以使用javap工具从class文件生成属性描述符。

    与属性描述符类似,函数也有函数描述符,通常我们又称为函数签名,一个函数描述符由他的参数类型和返回值类型组成,参数类型在前,且使用一对括号括起来,

参数类型是以他们在函数声明中的顺序罗列的,多个参数类型之间是没有分隔符,如果一个方法没有参数,使用一对空的括号表示即可。函数的返回值类型紧跟在包裹参数类型的右括号后边。

例如(I)V代指接收一个整型参数且返回值为空的函数。()D代指的是没有输入参数,返回值是一个double类型的函数


评论