1 回答

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個(gè)贊
您需要將庫(kù)打包到 jar 文件中,然后提取它,將其寫為文件,然后加載它(省略import語(yǔ)句和異常/錯(cuò)誤處理):
public class YourClass {
static {
// path to and base name of the library in the jar file
String libResourcePath = "path/to/library/yourLib.";
// assume Linux
String extension = "so";
// Check for Windows
String osName = System.getProperty("os.name").toLowerCase();
if (osName.contains("win"))
extension = "dll";
libResourcePath += extension;
// find the library in the jar file
InputStream is = ClassLoader.getSystemResourceAsStream( libResourcePath );
// create a temp file for the library
// (and we need the File object later so don't chain the calls)
File libraryFile = File.getTempFile("libName", extension);
// need a separate OutputStream object so we can
// explicitly close() it - can cause problems loading
// the library later if we don't do that
FileOutputStream fos = new FileOutputStream(libraryFile);
// assume Java 9
is.transferTo(fos);
// don't forget these - especially the OutputStream
is.close();
fos.close();
libraryFile.setExecutable(true);
libraryFile.deleteOnExit();
// use 'load()' and not 'loadLibrary()' as the
// file probably doesn't fit the required naming
// scheme to use 'loadLibrary()'
System.load(libraryFile.getCanonicalPath());
}
...
}
請(qǐng)注意,您需要為您支持的每個(gè)操作系統(tǒng)和體系結(jié)構(gòu)添加庫(kù)的版本。這包括 32 位和 64 位版本,因?yàn)楹芸赡茉?64 位操作系統(tǒng)上運(yùn)行 32 位 JVM。
您可以使用os.arch系統(tǒng)屬性來(lái)確定您是否在 64 位 JVM 中運(yùn)行。如果該屬性中包含該字符串"64",則表明您正在 64 位 JVM 中運(yùn)行。可以很安全地假設(shè)它是 32 位 JVM,否則:
if (System.getProperty("os.arch").contains("64"))
// 64-bit JVM code
else
// 32-bit JVM code
YourClass.class.getClassLoader().getResourceAsStream()如果您要自定義類加載器,您可能還必須使用。
注意操作系統(tǒng)和 CPU 兼容性。您需要編譯您的庫(kù),以便它們?cè)谳^舊的操作系統(tǒng)版本和較舊的 CPU 上運(yùn)行。如果您在新 CPU 上構(gòu)建 Centos 7,那么嘗試在 Centos 6 或更舊的 CPU 上運(yùn)行的人將會(huì)遇到問(wèn)題。SIGILL您不希望您的產(chǎn)品因?yàn)槟膸?kù)收到非法指令的信號(hào)而導(dǎo)致用戶崩潰。我建議在可以控制構(gòu)建環(huán)境的虛擬機(jī)上構(gòu)建庫(kù) - 使用較舊的 CPU 型號(hào)創(chuàng)建虛擬機(jī)并在其上安裝舊的操作系統(tǒng)版本。
您還需要注意/tmp使用noexec. 該設(shè)置或某些 SE Linux 設(shè)置可能會(huì)導(dǎo)致共享對(duì)象加載失敗。
添加回答
舉報(bào)