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文件