您的位置:首页 > 其它

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++代码。

那么在这个系列的第一期,我来简单的介绍下这个外壳的基础知识。

Boolean

Z

Byte

B

Char

C

Short

S

Int

I

Long

J

Float

F

Double

D

Void

V

上面这个列表第一列是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代码就很容易理解上面说的这些。

(*evn)->GetMethodID(evn, objclass, "callback", "(Ljava/lang/String;)V");


  上面这个方法是获取methodId,那么这个method就是objclass对应的方法

  void callback(String)

JNI的第一期就到这里了,下次会继续介绍JNI开发。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: