最近自己寫的一個廣告發布平臺要遷移到Linux平臺上,由于之前用的是windows平臺的dll文件,現在要改用.so。講下如何在Linux下面調用.so。
在linx下使用jna調用本地方法的時候,需要將C寫成的程序編譯為so文件
1、寫一個簡單test.c文件:
- #include<stdio.h>
- int add(int a,int b);
- int add(int a,int b)
- {
- int c = a + b ;
- return c ;
- }
2、編譯為so動態鏈接庫:- gcc -fpic -c test.c
-
- gcc -shared -o libtest.so test.o
-
- ls看一下生成的文件:
-
- libtest.so test.c test.o
這樣就會生成so文件了。 這里為什么要命名為libtest.so而不是test.so呢?因為jna在找so文件的時候,要匹配前綴為lib的so文件3、接下來開始寫java文件(需要下載jna.jar),我們寫一個TestSo.java:
- import com.sun.jna.Library;
- import com.sun.jna.Native;
- public class TestSo {
- public interface LgetLib extends Library {
- // 調用linux下面的so文件,注意,這里只要寫test就可以了,不要寫libtest,也不要加后綴
- LgetLib INSTANCE = (LgetLib) Native.loadLibrary("test",LgetLib.class);
- int add(int a,int b);
- }
- public int add(int a,int b){
- return LgetLib.INSTANCE.add(a,b);
- }
- public static void main(String[] args) {
- TestSo ts = new TestSo();
- int c = ts.add(10,20);
- System.out.println("10+20="+c);
- }
- }
4、 接下來進行編譯:- export CLASSPATH=$CLASSPATP:./jna.jar //這里是設置環境變量
-
- javac TestSo.java
這里直接運行TestSo的話:- java TestSo
- Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'test': libtest.so: cannot open shared object file: No such file or directory
- at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:163)
- at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:236)
- at com.sun.jna.Library$Handler.<init>(Library.java:140)
- at com.sun.jna.Native.loadLibrary(Native.java:379)
- at com.sun.jna.Native.loadLibrary(Native.java:364)
- at TestSo$LgetLib.<clinit>(TestSo.java:7)
- at TestSo.add(TestSo.java:11)
- at TestSo.main(TestSo.java:15)
這個錯誤是指找不到so文件。于是我們將so文件所在的目錄設置到環境變量LD_LIBRARY_PATH中:vim /etc/profile
在export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC下面加入
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${你的so目錄}
之后,你可以檢查一下設置的起沒起效果:echo $LD_LIBRARY_PATH,如果出現你設置的內容就對了,如果沒有,你可以重新打開一個窗口再查一下
設置好環境變量之后,你就可以運行java類了:
java TestSo
10+20=30
到此運行成功。
如果你遇到了緊急的情事,而這個地方又搞不定,你可以暫時交so文件放到/usr/lib這個目錄下面,一般是可以使程序運行的。