实现一个最简单的 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
linux
命令解释: -d:表示生成目录,生成的目录以package的定义为准;
.:表示在当前所在文件夹中生成ubuntu
查看生成的文件和目录vim
ls -al
首先生成.h
头文件oracle
javah sf.gg.Hello
查看生成的 sf_gg_Hello.h
文件jvm
vim sf_gg_Hello.h
以下:.net
/* DO NOT EDIT THIS FILE - it is machine generated */ /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* 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 代码code
vim hello.c
代码以下:blog
#include<stdio.h> #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 ltsget
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")); } }
其它相关资料参考:
System.load 和 System.loadLibrary详解 1