JNI静态注册之Java调C一
时间:2016-12-14作者:华清远见
一、 JNI 是什么? JNI是Java Native Interface的缩写(Java本地调用)。 Java平台和本地C代码进行相互操作的API接口称为Java本地代码接口。 二、 JNI使用的场合 1.当应用程序需要访问系统的各个特性和设备,并且这些特性和设备通过Java平台是无法访问时。 2.在一些要求效率和速度的场合,本地代码的运行效率高,比如复杂数学运算,游戏上的3D效果等等。 需要Native语言实现时。 3.当某个模块功能,已经有了一个成熟的,且经过大量测试的N ative代码实现,并且知道如何将其移植到所使用的目标平台上时。 注意:在没有必要的场合尽量避免使用。然而在android中大量的使用了JNI技术来使用本地系统库和底层交互,Java虚拟机之所以屏蔽了平台间的差异,也因为使用了JNI。 三、 预备知识 熟话说、在一起就要在一起的样子。C为了和Java之间是实现相互调用。必须在C中定义对应于Java中的数据类型。于是有了: 1. 基本数据类型转换 2. 引用数据类型 四、 Java调用C中的代码 就是实现java层的方法和JNI层中的其兄弟之间,实现一种映射。这种映射包括两种: 静态、动态。下面我们接受静态映射。也可以说是JNI的静态注册。 4.1过程步骤: ◆ 1)在java中声明一个本地方法 ◆ 2)运行javah获得头文件,包括这个本地方法的声明格式 ◆ 3)用C实现本地方法 ◆ 4)生成.so文件,并将其放入到共享类库中 ◆ 5)在java文件中加载该类库,调用本地方法 4.3代码 主程序MyJNITest调用MyJNI中的本地代码cSayHello方法 import com.farsight.demo.MyJNI; 五、 操作步奏 命令行输入: 1.编译java源文件 javac -d . MyJNI.java javac MyJNItest.java 2. 生成头文件并编写本地代码。 javah com.farsight.demo.MyJNI,得知C中兄弟(JNI方法格式)的摸样。 MyJNI.c 3.将本地代码生成库的形式。 gcc –fPIC –I jdk/include -I jdk/include/linux –shared –o libMyJNI.so MyJNI.c 4.运行java代码,注意指定加载.SO文件的路径。 java –Djava.library.path=. MyJNITest (–Djava.library.path=. 表示在当前路径下加载.so库文件) 六、本案例步骤框图
发表评论
|