JNI 学习
- 简介
JNI是java native interface的简写,JNI主要用于通过java程序调用本地库,在windows世界里是.dll文件,在unix世界里是.so文件。
- 使用
使用JNI主要包含如下步骤:
(1)编写java代码,注明要访问的本地动态连接库和本地方法;
(2)编译得到.class文件;
(3)使用javah 生成该类对应的C语言.h文件;
(4)使用C/C++实现(3)生成的.h文件中声明的各函数;
(5)编译C/C++实现代码生成动态连接库。
(6)生成jar包供别人调用
下面将用经典的HelloWorld来说明一下如何使用JNI:
1. 编写HelloWorld.java,首先需要在该类中load所调用的库,其次要声明在本地库中的方法名称,如下:
public class HelloWorld
{
static{
System.loadLibrary("hello");
}
public native void sayHello();
}
2. 编译 HelloWorld.java 生成 HelloWorld.class
javac HelloWorld.java
3. 根据 HelloWorld.class 生成 HelloWorld.h
javah HelloWorld
这里面只要关注在本地库中实现的方法。
JNIEXPORT void JNICALL Java_HelloWorld_sayHello
(JNIEnv *, jobject);
4. 编写 HelloWorld.cpp 实现上面的函数
#include "HelloWorld.h"
void JNICALL Java_HelloWorld_SayHello(JNIEnv * env, jobject obj)
{
printf("Hello, world");
}
5. 编译生成.so文件
g++ -fPIC -shared HelloWorld.cpp -o libhello.so
6. 生成jar包
jar cvf hello.jar HelloWorld.class
- 需要注意的地方
1. .c或者.cpp文件实现的函数要和.h文件定义的名字一样才行
2. 如果load的本地库为hello,则生成的时候要指定-o libhello.so