实现一个最简单的 JNI 调用
编写 Java 代码
package sf.gg;
public class Hello{
public native static int add(int x,int y); //java 代码中声明 native 方法
static {
System.load("/home/lance/main.so"); //以绝对路径加载so文件 }
public static void main(String[] args){
System.out.println(add(1,1));
}
}
编译 java 代码 javac -d . Hello.java
命令解释: -d:表示生成目录,生成的目录以package的定义为准;
.:表示在当前所在文件夹中生成
查看生成的文件和目录
ls -al
编写C代码
首先生成.h头文件
javah sf.gg.Hello
查看生成的 sf_gg_Hello.h 文件
vim sf_gg_Hello.h
如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class sf_gg_Hello */
#ifndef _Included_sf_gg_Hello
#define _Included_sf_gg_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: sf_gg_Hello
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_sf_gg_Hello_add
(JNIEnv *, jclass, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
编写实现add 方法的 C 代码
vim hello.c
代码如下:
#include
#include "sf_gg_Hello.h"
JNIEXPORT jint JNICALL Java_sf_gg_Hello_add(JNIEnv *env, jclass jc, jint x, jint y){
return x+y; //简单的加法
}
编译运行
OS: ubuntu 14.04 lts
gcc -fPIC -D_REENTRANT -I/usr/lib/jvm/java-8-oracle/include -I/usr/lib/jvm/java-8-oracle/include/linux -c hello.c
命令解释: man gcc
注意:需要命令中的/usr/lib/jvm/java-8-oracle/include 需要换成本机的 jdk 对应的目录
生成 so 库
gcc hello.o -o main.so -shared
查看生成的文件
ls -al
运行
java sf.gg.Hello
总结
编写带有native声明的方法的Java类
使用javac命令编译编写的Java类
使用javah ...来生成后缀名为.h的头文件
使用其他语言(C、C++)实现本地方法
将本地方法编写的文件生成动态链接库
补充
如果以其他方式调用,出现no dll或so in java.library.path ,参考此文:JAVA WEB项目加载dll文件失败,no xxx in java.library.path
输出系统 java.library.path
public class PrintPath{
public static void main(String[] args){
System.out.println(System.getProperty("java.library.path"));
}
}
其它相关资料参考: