JNI学习随笔系列一
2014-12-13 20:55
162 查看
因为项目需要,最近有比较多的接触JNI,写JNI随笔系列,一方面是为了自己做些经验积累,另一方面是为了帮助有需要的人。
首先在使用JNI之前,需要先了解为什么要使用JNI,什么情况下使用。
你的Java代码,需要得到一个文件的属性。但是你找遍了JDK帮助文档也找不到相关的API。
在本地还有一个别的系统,不过他不是Java语言实现的,这个时候你的老板要求你把两套系统整合到一起。
你的Java代码中需要用到某种算法,不过算法是用C实现并封装在动态链接库文件(DLL)当中的。
我自己补充的,因为Java代码很容易被反编译,所以有时候为了出于安全的考虑,有时候会在代码里使用JNI去做数据安全的工作。
但是如果你在代码里使用了JNI,那么你就丧失了Java跨平台的优势,因为我们知道JNI的代码大部分是C/C++代码,不同的平台有不同C/C++的编译器,那么往往在移植这些JNI代码到其他的平台的时候需要对JNI代码进行修改,那么开发人员需要维护两个平台对应的JNI代码。
JNI是什么呢,其实是对本地代码(C/C++)的一层封装,就相当于是在C/C++代码的外面加了一层表象外壳,Java代码可以通过这个外壳,间接的调用或者使用C/C++代码。
那么在这个系列的第一期,我来简单的介绍下这个外壳的基础知识。
上面这个列表第一列是Java类型,第二列是JNI类型。
如果以一个L开头的描述符,就是类描述符,它后紧跟着类的字符串,然后分号“;”结束。
比如"Ljava/lang/String;"就是表示类型String;
"[I"就是表示int[];
"[Ljava/lang/Object;"就是表示Object[]。
JNI方法描述符,主要就是在括号里放置参数,在括号后面放置返回类型,如下:
(参数描述符)返回类型
比如"()Ljava/lang/String;"就是表示String f();
"(ILjava/lang/Class;)J"就是表示long f(int i, Class c);
"([B)V"就是表示void String(byte[] bytes);
看了这些你可能觉得有点抽象,没关系,你只要稍微看一段JNI代码就很容易理解上面说的这些。
上面这个方法是获取methodId,那么这个method就是objclass对应的方法
void callback(String)
JNI的第一期就到这里了,下次会继续介绍JNI开发。
首先在使用JNI之前,需要先了解为什么要使用JNI,什么情况下使用。
你的Java代码,需要得到一个文件的属性。但是你找遍了JDK帮助文档也找不到相关的API。
在本地还有一个别的系统,不过他不是Java语言实现的,这个时候你的老板要求你把两套系统整合到一起。
你的Java代码中需要用到某种算法,不过算法是用C实现并封装在动态链接库文件(DLL)当中的。
我自己补充的,因为Java代码很容易被反编译,所以有时候为了出于安全的考虑,有时候会在代码里使用JNI去做数据安全的工作。
但是如果你在代码里使用了JNI,那么你就丧失了Java跨平台的优势,因为我们知道JNI的代码大部分是C/C++代码,不同的平台有不同C/C++的编译器,那么往往在移植这些JNI代码到其他的平台的时候需要对JNI代码进行修改,那么开发人员需要维护两个平台对应的JNI代码。
JNI是什么呢,其实是对本地代码(C/C++)的一层封装,就相当于是在C/C++代码的外面加了一层表象外壳,Java代码可以通过这个外壳,间接的调用或者使用C/C++代码。
那么在这个系列的第一期,我来简单的介绍下这个外壳的基础知识。
Boolean | Z |
Byte | B |
Char | C |
Short | S |
Int | I |
Long | J |
Float | F |
Double | D |
Void | V |
如果以一个L开头的描述符,就是类描述符,它后紧跟着类的字符串,然后分号“;”结束。
比如"Ljava/lang/String;"就是表示类型String;
"[I"就是表示int[];
"[Ljava/lang/Object;"就是表示Object[]。
JNI方法描述符,主要就是在括号里放置参数,在括号后面放置返回类型,如下:
(参数描述符)返回类型
比如"()Ljava/lang/String;"就是表示String f();
"(ILjava/lang/Class;)J"就是表示long f(int i, Class c);
"([B)V"就是表示void String(byte[] bytes);
看了这些你可能觉得有点抽象,没关系,你只要稍微看一段JNI代码就很容易理解上面说的这些。
(*evn)->GetMethodID(evn, objclass, "callback", "(Ljava/lang/String;)V");
上面这个方法是获取methodId,那么这个method就是objclass对应的方法
void callback(String)
JNI的第一期就到这里了,下次会继续介绍JNI开发。
相关文章推荐
- [JNI]学习笔记系列:一
- JNI 学习笔记系列(一)
- JNI学习系列——在C/C++中调用JAVA
- JNI 学习笔记系列(一)
- JNI 学习笔记系列(二)
- JNI 学习笔记系列(二)
- android 学习随笔二十七(JNI:Java Native Interface,JAVA原生接口 )
- [JNI]学习笔记系列:二 基本数据类型,字符串,数据
- JNI 学习笔记系列(一)
- JNI 学习笔记系列(二)
- Android JNI学习系列1.2—— JNI方法名,数据类型和方法签名的一些认识
- JNI 学习笔记系列(一)
- Hadoop 系列 - (1) - 学习随笔 - 起源、构成
- JNI学习系列——深入了解JNI
- JNI 学习笔记系列(一)
- android 学习随笔二十七(JNI:Java Native Interface,JAVA原生接口 )
- JNI 学习笔记系列(二)
- ASP.NET2.0学习系列
- 昨天,我的大学学习系列文章(转贴)
- Tomcat代码学习日记系列.