1.编写HelloJNI.java文件(包名为JNI)java
package JNI;
public class HelloJNI
{
static
{
System.load("/root/lib/goodluck.so"); //使用绝对路径加载名称为goodluck.so的库文件
// System.loadLibrary("goodluck"); //使用默认路径加载
}
public native static int get(); //native关键字
public native static void set(int i);
public static void main(String[] args)
{
HelloJNI test = new HelloJNI();
test.set(10);
System.out.println(test.get());//若是成功,控制台会打印出10。
}
}linux
2.编译HelloJNI.java文件成为.class文件spa
javac -d . HelloJNI.java //编译出带有包的class文件,以这个为例get
javac -d . HelloJNI.java //编译出不带包名的class文件编译
3.根据class文件生成.h头文件class
注意:得在包名的起始位置进行编译点h头文件test
4.编写HelloJNI.c文件,实现引用第3步中生成的.h头文件,并实现其中声明的方法。gcc
#include "JNI_HelloJNI.h"
int i = 0;
JNIEXPORT jint JNICALL Java_JNI_HelloJNI_get(JNIEnv *env, jclass jc)
{
return i;
}
JNIEXPORT void JNICALL Java_JNI_HelloJNI_set(JNIEnv *env, jclass jc, jint j)
{
i = j;
}引用
5.将第4步中编写的HelloJNI.c文件,编译成.o文件gc
gcc -fPIC -D_REENTRANT -I$JAVA_HOME/include -I$JAVA_HOME/include/linux -c HelloJNI.c
注:$JAVA_HOME/include 是jni.h头文件所在的路径
$JAVA_HOME/include/linux是jni_md.h所在的路径
为了方即可以写成sh来执行
若是找不到jni.h和jni_md.h路径,根目录下执行 find -name jni.h find -name jni_md.h 而后pwd查看,再全路径引用便可。
6.将第5步中生成的HelloJNI.o文件编译成.so库文件
gcc -shared HelloJNI.o -o goodluck.so//用绝对路径load的话能够生成和load相同的文件名字
gcc -shared HelloJNI.o -o libgoodluck.so//使用loadLibrary(System.loadLibrary("goodluck"); 使用默认路径加载)的话,须要默认以lib开头。
在Linux平台上,遵循JNI规范的动态连接库文件名必须以“lib”开头。例如在上面的Java程序中指定的库文件名为“goodluck”,则实际的库文件应该命名为“libgoodluck.so”。
7.将第6步中生成的goodluck.so文件拷贝到java的加载库LD_LIBRARY_PATH指向的路径中。
根目录下mkdir lib //新建lib文件夹
把goodluck.so文件拷贝到该目录下
注:也能够在别的地方新建目录,只要在java文件引用库可以load到。
8.执行class文件