當前位置:首頁 » 操作系統 » linuxso使用

linuxso使用

發布時間: 2023-01-04 08:12:17

A. 請教關於android linux動態庫.so的載入調用

有這兩種辦法:
第一種:
需求:
有時候應用修復了native層一個小BUG,應用需要更新了,但是用戶必須下載整個APK包進行安裝,而我們需要的只是替換SO
於是想,能不能載入自定義路徑下的 SO 文件呢
答案是完全沒問題:
使用系統方法:
void java.lang.System.load(String pathName)
但是有一點,pathName 路徑必須有執行許可權,意思就是說我們不能載入SD卡上的SO,因為沒有執行許可權
那也沒關系,我們復制到應用私有目錄下就OK嘛。
看碼
private void load() {
File dir = getDir("libs", Context.MODE_PRIVATE);
File soFile = new File(dir, "libTestJNI.so");
FileUtils.assetToFile(this, "libTestJNI.so", soFile);

try {
System.load(soFile.getAbsolutePath());
} catch (Exception e) {
}
}
這樣就完全OK,
我們只需要架個伺服器,每次啟動時動態監測 SO 文件有沒有更新,有則下載SO,然後載入,這樣就可以避免用戶安裝新的應用,
要知道重新安裝應用的用戶體驗是很差的,要讓用戶無感知的更新他。
第二種:
採用dlopen動態載入第三方庫,無非和system.load一樣,就是要實現指定路徑載入so的目的,這種方法升級so的話,那就的需要一個基本so,一直不變,用來調用dlopen,然後升級另一個so。
這兩種辦法都會遇到一個問題,就是不能直接載入SD卡中的so,因為sd卡沒有執行許可權,不能直接載入這種二進制文件,需要拷貝到data/data/packagename/files/ 目錄下,再次進行載入即可,拷貝也是有講究的,需要用到context.openFileOutput方法。

B. linux的C編程,怎麼使用so文件,freeimage的lib使用

樓主您好!
很高興和您交流。
關於您的描述,我懷疑問題出在:調用動態庫的時候,需要對當前目錄進行環境變數的設置。
即:export LD_LIBRARY_PATH=/usr/lib/(如果我沒記錯的話)
之後重啟終端,試試。
希望能夠幫到您。
祝您愉快!

C. Linux c調用so

實例代碼(soTest.c):

1 #include <stdio.h>
2 #include <dlfcn.h>
3
4 int main(int argc, char *argv[]){
5 void * libm_handle = NULL;
6 float (*cosf_method)(float);
7 char *errorInfo;
8 float result;
9
10 // dlopen 函數還會自動解析共享庫中的依賴項。這樣,如果您打開了一個依賴於其他共享庫的對象,它就會自動載入它們。
11 // 函數返回一個句柄,該句柄用於後續的 API 調用
12 libm_handle = dlopen("libm.so", RTLD_LAZY );
13 // 如果返回 NULL 句柄,表示無法找到對象文件,過程結束。否則的話,將會得到對象的一個句柄,可以進一步詢問對象
14 if (!libm_handle){
15 // 如果返回 NULL 句柄,通過dlerror方法可以取得無法訪問對象的原因
16 printf("Open Error:%s.\n",dlerror());
17 return 0;
18 }
19
20 // 使用 dlsym 函數,嘗試解析新打開的對象文件中的符號。您將會得到一個有效的指向該符號的指針,或者是得到一個 NULL 並返回一個錯誤
21 cosf_method = dlsym(libm_handle,"cosf");
22 errorInfo = dlerror();// 調用dlerror方法,返回錯誤信息的同時,內存中的錯誤信息被清空
23 if (errorInfo != NULL){
24 printf("Dlsym Error:%s.\n",errorInfo);
25 return 0;
26 }
27
28 // 執行「cosf」方法
29 result = (*cosf_method)(0.0);
30 printf("result = %f.\n",result);
31
32 // 調用 ELF 對象中的目標函數後,通過調用 dlclose 來關閉對它的訪問
33 dlclose(libm_handle);
34
35 return 0;
36 }

在這個例子中主要是調用了 math 庫(libm.so)中的「cosf」函數,dlopen函數的第二個參數表示載入庫文件的模式,主要有兩種:RTLD_LAZY 暫緩決定,等有需要時再解出符號;RTLD_NOW 立即決定,返回前解除所有未決定的符號。另外記得引用包含API的頭文件「#include <dlfcn.h>」(^_^)。

D. Linux .so庫的使用

新建一個sort.c文件,寫一個最簡單的排序

使用 gcc -o libsort.so -fPIC -shared sort.c 產生libsort.so庫。

.so庫有兩種調用方法:

新建main.c文件:

使用命令 gcc -o main main.c -lsort -L. 編譯

新建main2.c文件:

使用命令 gcc -o main2 main2.c -ldl 編譯。動態載入.so庫的話需要-ldl。
運行./main2後輸出遞增序列,調用成功。

E. Linux c++開發.so文件的使用

假設在linux上用gcc編譯程序,需要用下列編譯選項生成.so文件:

gcc -fPIC -shared
.so 文件安裝一般是在/usr/lib或者/usr/local/lib下,安裝後不需要絕對路徑即可使用。當然你也可以安裝到工程文件夾下面,不過很少有這么做的。使用時只需要dlopen()函數打開這個庫,用dlsym()函數將動態庫的函數體載入進來;同樣已載入的動態函數庫可以用dlclose()關閉。
詳細使用方法網路搜dlopen 即可。

F. linux so是什麼 文件

.so文件代表Linux的共享函數庫文件,程序運行時可能會使用到裡面的函數代碼。當一個程序需要.so共享函數庫文件時,系統自動會把它載入到內存中使用。相當於Windows系統裡面的dll動態鏈接庫文件。

G. 請教關於android linux動態庫.so的載入調用

1、 .so動態庫的生成
可使用gcc或者g++編譯器生成動態庫文件(此處以g++編譯器為例)
g++ -shared -fPIC -c XXX.cpp
g++ -shared -fPIC -o XXX.so XXX.o
2、 .so動態庫的動態調用介面函數說明
動態庫的調用關系可以在需要調用動態庫的程序編譯時,通過g++的-L和-l命令來指定。例如:程序test啟動時需要載入目錄/root/src/lib中的libtest_so1.so動態庫,編譯命令可照如下編寫執行:
g++ -g -o test test.cpp –L/root/src/lib –ltest_so1
(此處,我們重點講解動態庫的動態調用的方法,關於靜態的通過g++編譯命令調用的方式不作詳細講解,具體相關內容可上網查詢)

Linux下,提供專門的一組API用於完成打開動態庫,查找符號,處理出錯,關閉動態庫等功能。
下面對這些介面函數逐一介紹(調用這些介面時,需引用頭文件#include <dlfcn.h>):
1) dlopen
函數原型:void *dlopen(const char *libname,int flag);
功能描述:dlopen必須在dlerror,dlsym和dlclose之前調用,表示要將庫裝載到內存,准備使用。如果要裝載的庫依賴於其它庫,必須首先裝載依賴庫。如果dlopen操作失敗,返回NULL值;如果庫已經被裝載過,則dlopen會返回同樣的句柄。
參數中的libname一般是庫的全路徑,這樣dlopen會直接裝載該文件;如果只是指定了庫名稱,在dlopen會按照下面的機制去搜尋:
a.根據環境變數LD_LIBRARY_PATH查找
b.根據/etc/ld.so.cache查找
c.查找依次在/lib和/usr/lib目錄查找。
flag參數表示處理未定義函數的方式,可以使用RTLD_LAZY或RTLD_NOW。RTLD_LAZY表示暫時不去處理未定義函數,先把庫裝載到內存,等用到沒定義的函數再說;RTLD_NOW表示馬上檢查是否存在未定義的函數,若存在,則dlopen以失敗告終。
2) dlerror
函數原型:char *dlerror(void);
功能描述:dlerror可以獲得最近一次dlopen,dlsym或dlclose操作的錯誤信息,返回NULL表示無錯誤。dlerror在返回錯誤信息的同時,也會清除錯誤信息。
3) dlsym
函數原型:void *dlsym(void *handle,const char *symbol);
功能描述:在dlopen之後,庫被裝載到內存。dlsym可以獲得指定函數(symbol)在內存中的位置(指針)。如果找不到指定函數,則dlsym會返回NULL值。但判斷函數是否存在最好的方法是使用dlerror函數,
4) dlclose
函數原型:int dlclose(void *);
功能描述:將已經裝載的庫句柄減一,如果句柄減至零,則該庫會被卸載。如果存在析構函數,則在dlclose之後,析構函數會被調用。
3、 普通函數的調用
此處以源碼實例說明。各源碼文件關系如下:
test_so1.h和test_so1.cpp生成test_so1.so動態庫。
test_so2.h和test_so2.cpp生成test_so2.so動態庫。
test_dl.cpp生成test_dl可執行程序,test_dl通過dlopen系列等API函數,並使用函數指針以到達動態調用不同so庫中test函數的目的。

H. LINUX下.so結尾的文件如何運行,或者使用

.so結尾的文件是動態鏈接庫,動態鏈接庫不能主動運行,只能被動調用。

.so的使用方法:

  1. 需要這個庫放置到程序的搜索路徑下

  2. 需要這個庫提供的頭文件在c/c++程序中鏈接調用

  3. c/c++程序執行時會到搜索路徑下動態載入.so庫

I. linux中.so後綴的文件怎麼使用

在WINDOWS系統中有很多的動態鏈接庫(以.DLL為後綴的文件,DLL即Dynamic Link Library)。這種動態鏈接庫,和靜態函數庫不同,它裡面的函數並不是執行程序本身的一部分,而是根據執行程序需要按需裝入,同時其執行代碼可在多個 執行程序間共享,節省了空間,提高了效率,具備很高的靈活性。同樣,LINUX的也具備類似的動態鏈接庫,而且為數不少。在/lib目錄下,就有許多以.so作後綴的文件,這就是LINUX系統應用的動態鏈接庫,只不過與WINDOWS叫法不同,它叫so,即Shared Object,共享對象。(在LINUX下,靜態函數庫是以.a作後綴的) X-WINDOW作為LINUX下的標准圖形窗口界面,它本身就採用了很多的動態鏈接庫(在/usr/X11R6/lib目錄下),以方便程序間的共享, 節省佔用空間。flash只是一個插件,在windows中就是一個ocx的鏈接庫方式(和dll略有不同),因此linux中一旦你了一個共享函數庫,你還需要安裝它。其實簡單的方法就是拷貝 x0dx0a你的庫文件到指定的標準的目錄(例如/usr/lib),然後運行ldconfig。 x0dx0a如果你沒有許可權去做這件事情,例如你不能修改/usr/lib目錄,那麼 x0dx0a你就只好通過修改你的環境變數來實現這些函數庫的使用了。首先, x0dx0a你需要創建這些共享函數庫;然後,設置一些必須得符號鏈接,特別 x0dx0a是從soname到真正的函數庫文件的符號鏈接,簡單的方法就是運行ldconfig: x0dx0aldconfig -n directory_with_shared_libraries x0dx0a然後你就可以設置你的LD_LIBRARY_PATH這個環境變數,它是一個以逗號 x0dx0a分隔的路徑的集合,這個可以用來指明共享函數庫的搜索路徑。例如 x0dx0a,使用bash,就可以這樣來 x0dx0a啟動一個程序my_program: x0dx0aLD_LIBRARY_PATH=.LD_LIBRARY_PATH my_program

J. linux的C編程,怎麼使用so文件

linux下的.so文件為共享庫,相當於windows下的dll文件,使用方法如下:
在你的工程源代碼里包含.h頭文件,然後可以調用動態庫里的函數,在鏈接的時候加上如下編譯器參數:
-l xx.so
如果你的so文件是以lib開頭的,還可以直接這樣使用:
-lxx
xx是你的.so文件名
其實使用方法和你使用數學庫函數是一樣的,源代碼中添加
#include <math.h>,編譯的時候,加上-lm參數。

熱點內容
linux搭建android開發環境 發布:2025-05-11 00:18:45 瀏覽:947
web本地存儲 發布:2025-05-11 00:13:33 瀏覽:360
為什麼暗格里的密碼搜不到了 發布:2025-05-11 00:13:31 瀏覽:942
oracle存儲過程使用變數 發布:2025-05-11 00:10:07 瀏覽:741
用安卓下載蘋果的軟體叫什麼 發布:2025-05-11 00:08:22 瀏覽:115
斷牙腳本 發布:2025-05-11 00:04:21 瀏覽:68
sim卡的密碼怎麼設置密碼 發布:2025-05-10 23:41:09 瀏覽:716
自定義緩存註解 發布:2025-05-10 23:40:06 瀏覽:118
sqltext類型長度 發布:2025-05-10 23:30:21 瀏覽:979
圖形AI演算法 發布:2025-05-10 23:30:19 瀏覽:183