Android中关于JNI 的学习(二)对于JNI方法名,数据类型和方法签名的一些认识
2016-05-25 17:20
645 查看
我们知道,利用javah生成的c/c++头文件的时候,会对java中定义的 native 函数生成对应的jni层函数,如下:
?
我们可以看到方法名是以Java_com_lms_jni等开头的,还有什么所谓的Signature,那这些其实都是什么意思呢,今天我们就来简单地认识一下。
1) 前缀: Java_
2) 类的全限定名,用下划线进行分隔(_):com_lms_jni_JniTest
3) 方法名:getTestString
3) jni函数指定第一个参数: JNIEnv *
4) jni函数指定第二个参数: jobject
5) 实际Java参数: jstring, jint ....
6) 返回值的参数 : jstring, jint.... 所以对于在Java类 com.lms.jni.HwDemo中的一个方法:
?
其对应的jni层的方法如下:
?
如果不这样命名,当把动态库加载进DVM的时候,通过JNIEnv *指针去查找Java Native方法对应的JNI方法的时候,就会找不到了。
注意,我们也可以利用函数注册的方法,将Java层的方法名跟JNI层的方法名的对应关系保存起来,注册到DVM中,就不需要这样的命名规范了。
对于引用类型则有:jobject, jstring, jthrowable, jclass, jarray, 以及继承于jarray,对应于其原生类型的8种jarray和jobjectarray。
知道了不同的数据类型的转换关系,我们就知道在什么情况下,应该对数据进行怎么样的处理。
不过也正是因为其参数类型是不一样的,所以就出现了方法签名,利用方法签名和方法名来唯一确定一个JNI函数的调用。
既然方法签名是基于参数类型的不同而形成的,首先要知道Java各数据类型对应的签名是什么,也就是所谓的类型签名,
在jni.h文件中就已经定义了这样一套规则,如下:
?
对应于Java端的数据类型,我们也可以看一下下面的表:
对于上面的类,要注意其后面还有一个分号。
而对一个方法,其签名就是其参数类型签名和返回值类型签名的字符串,其形式如下:
(类型签名1类型签名2...)返回值类型签名
每个类型签名之间是没有空格的,下面看看两个例子:
有方法 1):
?
其对应的签名如下:
?
方法 2):
?
其对应的签名如下:
?
相信通过这两个例子,大家也能够了解了方法签名是什么样的形式了吧,对于JNI这些奇形怪状的表示形式也有一定的了解了。
结束。
?
JNI 命名规则
对于传统的JNI编程来说,JNI方法跟Java类方法的名称之间有一定的对应关系,要遵循一定的命名规则,如下:1) 前缀: Java_
2) 类的全限定名,用下划线进行分隔(_):com_lms_jni_JniTest
3) 方法名:getTestString
3) jni函数指定第一个参数: JNIEnv *
4) jni函数指定第二个参数: jobject
5) 实际Java参数: jstring, jint ....
6) 返回值的参数 : jstring, jint.... 所以对于在Java类 com.lms.jni.HwDemo中的一个方法:
?
?
注意,我们也可以利用函数注册的方法,将Java层的方法名跟JNI层的方法名的对应关系保存起来,注册到DVM中,就不需要这样的命名规范了。
JNI 数据类型
我们知道Java的数据类型是跟C/C++的数据类型是不一样的,而JNI是处于Java和Native本地库(大部分是用C/C++写的)中间的一层,JNI对于两种不同的数据类型之间必须做一种转换,所以在JNI跟Java之间就会有数据类型的对应关系。 在JNI中,提供了以下各种数据类型,可以分为原生类型和引用类型: 对于原生类型有:jchar, jbyte, jshort, jint, jlong, jfloat, jdouble, jboolean,其与java端的数据类型对应如下表:java | jni |
char | jchar |
byte | jbyte |
short | jshort |
int | jint |
long | jlong |
float | jfloat |
double | jdouble |
boolean | jboolean |
知道了不同的数据类型的转换关系,我们就知道在什么情况下,应该对数据进行怎么样的处理。
JNI方法签名
为什么会有方法签名这种东西呢?这是因为Java这边支持函数重载,即虽然参数不一样,但是方法名一样,那么在JNI层它们的方法名都会是一样的,那JNI也会犯迷糊了,得找哪个呢?不过也正是因为其参数类型是不一样的,所以就出现了方法签名,利用方法签名和方法名来唯一确定一个JNI函数的调用。
既然方法签名是基于参数类型的不同而形成的,首先要知道Java各数据类型对应的签名是什么,也就是所谓的类型签名,
在jni.h文件中就已经定义了这样一套规则,如下:
?
Java 类型 | 类型签名 |
boolean | Z |
byte | B |
char | C |
short | S |
int | I |
long | L |
float | F |
double | D |
类 | L全限定名;,比如String, 其签名为Ljava/lang/util/String; |
数组 | [类型签名, 比如 [B |
而对一个方法,其签名就是其参数类型签名和返回值类型签名的字符串,其形式如下:
(类型签名1类型签名2...)返回值类型签名
每个类型签名之间是没有空格的,下面看看两个例子:
有方法 1):
?
?
?
?
结束。
相关文章推荐
- Android6.0的通话记录获取
- 拥抱 Android Studio 之二:Android Studio 与 Gradle 深入
- RxAndroid 实践快速入门
- android学习18——对PathMeasure中getPosTan的理解
- 你需要知道的 Android 拍照适配方案
- Android照片墙完整版,完美结合LruCache和DiskLruCache
- android studio如何导包
- Android ColorState使用
- Android Studio导入银联sdk
- android系统裁减之服务裁减
- 自定义搜索功能Android实现
- Android自定义View知识体系
- android ndk 开发
- Android四大组件之BroadcastReceiver详细解析
- android启动过程之init.rc文件浅析
- RecyclerView分割线之RecyclerView.ItemDecoration的理解(笔记)
- Android签名总结
- Android : DevicePolicyManager
- Android Activity生命周期及启动模式详解
- 关于Android的Dialog