Linux平台Java調用so庫-JNI使用例子


1.確保gcc編譯器已安裝

2.編寫HelloJNI.java代碼,用native聲明需要用C實現的函數。
如果源程序是包含在package里的話,應該建立同樣的文件夾結構,比如/home/swan/test/net/wangliping/HelloJNI.java

package net.wangliping
public class HelloJNI
{
    static
    {
        System.loadLibrary("goodluck");
    }
    public native static int get();
    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());
    }
}

3.在HelloJNI.java文件所在目錄下編譯.java文件。

javac HelloJNI.java

4.在~/Desktop下編譯第三步中生成的.class文件,生成對應的.h頭文件,本例中生成的頭文件名為 net_wangliping_HelloJNI.h

javah net.wangliping.HelloJNI

5.編寫HelloJNI.c文件,實現引用第4步中生成的.h頭文件,並實現其中聲明的方法。

#include "net_wangliping_HelloJNI.h"
int i = 0;
JNIEXPORT jint JNICALL Java_net_wangliping_HelloJNI_get(JNIEnv *env, jclass jc)
{
    return i;
}
JNIEXPORT void JNICALL Java_net_wangliping_HelloJNI_set(JNIEnv *env, jclass jc, jint j)
{
    i = j;
}

6.將第5步中編寫的HelloJNI.c文件,編譯成.o文件

gcc -fPIC -D_REENTRANT -I/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include -I/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include/linux -c HelloJNI.c

注:/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include 是jni.h頭文件所在的路徑
/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include/linux 是jni_md.h所在的路徑

7.將第6步中生成的HelloJNI.o文件編譯成.so庫文件

gcc -shared HelloJNI.o -o libgoodluck.so

注:和windows下不同,linux的庫文件必須是以libxxx.so形式命令的(或者 libxxx.so.y,y是版本號),lib前綴是為了系統能夠識別它,xxx是java代碼System.loadLibrary("xxx");中引用庫的名字。

8.將第7步中生成的libgoodluck.so文件拷貝到java的加載庫LD_LIBRARY_PATH指向的路徑中。
前提是你有足夠的權限,如果沒有sudo權限的同學,用下面的方法:
1) 在/home下建立一個用來存放.so庫文件的目錄,比如/home/swan/lib
2) 把libgoodluck.so文件拷貝到該目錄下
3)打開Terminal,運行如下命令

export LD_LIBRARY_PATH=/home/swan/lib

只在當前shell下有效...

9.在運行HelloJNI.class

java net.wangliping.HelloJNI

一切正常后,可以看到運行結果是輸出了10,其值是由C語言代碼實現並返回的。

 

遇到問題:

1. JNI調用本地SO庫失敗 

解決方法:設置export LD_LIBRARY_PATH=/home/dev就好了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM