程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> JNA 調用 so 庫

JNA 調用 so 庫

編輯:C++入門知識

最近自己寫的一個廣告發布平台要遷移到Linux平台上,由於之前用的是windows平台的dll文件,現在要改用.so。講下如何在Linux下面調用.so。

在linx下使用jna調用本地方法的時候,需要將C寫成的程序編譯為so文件

1、寫一個簡單test.c文件:

[cpp] 
#include<stdio.h> 
int add(int a,int b); 
int add(int a,int b) 

      int c = a + b ; 
      return c ; 
}  

2、編譯為so動態鏈接庫:
[cpp] 
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:

[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、 接下來進行編譯:
[plain] 
export CLASSPATH=$CLASSPATP:./jna.jar                         //這裡是設置環境變量 
 
javac TestSo.java 

這裡直接運行TestSo的話:
[java] 
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這個目錄下面,一般是可以使程序運行的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved