簡體   English   中英

從 jar 加載庫

[英]Load library from jar

如何從 jar 加載庫? 例如

Test.jar
 +- libAbc.so
 +- libDef.so
 +- ...

可能不是您正在尋找的答案(將文件提取到臨時位置就是您正在尋找的答案),但我想我會分享一些真實世界的經驗:

從 jar 中提取庫所需的管道,確保它之后被清理,不與可能使用 jar 的其他應用程序發生沖突,等等......非常棘手。 這是可以做到的,但是很有可能您最終會遇到大量庫的臨時副本使用戶系統混亂,或者您最終會遇到使用庫的多個應用程序之間的沖突。

當您添加一個事實時,許多操作系統不允許將任何文件用作庫(並且經常,將運行您的應用程序的用戶的權限不允許他們標記臨時文件夾中的任意文件執行),將本機庫打包在 jar 中的想法變得不那么有吸引力。

我們最終做的是轉移到一個模型,我們讓我們的安裝程序(它確實以足夠的權限運行)將適當的本機庫放在 jar 旁邊。 這相當簡單,將所有正在執行的庫保存在同一個位置,並且易於管理和理解(試圖在一個應用程序 b/c 中跟蹤版本不兼容,它正在嘗試加載已保存到臨時存儲的庫通過第二個應用程序是一個徹底的噩夢)。

本機代碼正在由底層操作系統加載,如果該代碼無法在 jar 文件中查看以獲取您要加載的字節(Windows 不能),您必須自己在文件系統中訪問它。

你能在你的 jar 文件旁邊部署你的庫嗎?

您必須將其解壓到某個臨時目錄中並使用`System.load("path/to/libAbc.so")。

這在前面已經討論過

編輯:更正了鏈接。

庫必須從文件系統加載。 所以你可以將你的庫從 jar 中提取到一個臨時目錄中並加載它。

您必須從 JAR 中提取文件並加載它們;

System.load("path/to/files/<name>.so");

但是不要忘記在程序關閉后清理文件,如果提取它們不需要太長時間;

libraryFile.deleteOnExit();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM