Linux下java調用c的動態庫

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

 

相關文章
相關標籤/搜索