一、什么是JNI
Java以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决Java对本地操作的一种方法就是JNI。JNI是Java native interface的简写,意为Java本地调用,它允许Java代码和其他语言写的代码进行交互,从Java1.1开始,JNI标准成为Java平台的一部分。
使用Java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。例如,与硬件、操作系统进行交互,或者为了提高程序的性能。
二、平台以及环境
(1)开发平台
Linux系统或者虚拟机。
注意:因为涉及到LINUX下的HID接口,所以保证开发的系统内核在2.6版本以上。
(2)开发包
1):安装gcc和g++,保证两个版本一致。
安装zhiling:
yum install gcc
yum install gcc-c++
查版本zhiling:
g++ --version
gcc --version
2):安装jdk环境。具体可以上网上找资料。
以debian系统为例,在终端运行的安装zhiling如下:
sudo apt-get update
sudo apt-get install default-jre
sudo apt-get install default-jdk
三、开发步骤
1)创建一个Java程序(如LKT5103AJni.java)定义原生的c/c++函数。
2)用javac编译(zhiling:javac LKT5103AJni.java) LKT5103AJni.java生成 LKT5103AJni.class。
3)用javah带-jni参数编译zhiling:javah -jni LKT5103AJni) LKT5103AJni.class生成 LKT5103AJni.h文件,该文件中 定义了c的函数原型。在实现c函数的时候需要。
4)创建LKT5103AJni.c,实现LKT5103AJni.h定义的函数。
5)编译LKT5103AJni.c生成libLKT5103AJni.so。
zhiling:gcc -I/usr/lib/jvm/java-8-openjdk-amd64/include/ -I/usr/lib/jvm/java-8-openjdk-amd64/include/linux -fPIC -shared -o libLKT5103AJni.so LKT5103AJni.c
6)创建testJni.Java,实现测试jni接口。
7)编译testJni.java(zhiling:javac testJni.java)。
8)运行测试代码。
(zhiling:export LD_LIBRARY_PATH=./
java testJni
或者:
java -Djava.library.path=. testJni)