第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

使用 RXTX 部署獨(dú)立應(yīng)用程序

使用 RXTX 部署獨(dú)立應(yīng)用程序

qq_笑_17 2023-07-28 10:45:57
我有一個(gè)現(xiàn)有的應(yīng)用程序,通常通過(guò) TCP 與其目標(biāo)進(jìn)行通信,但是新的要求規(guī)定也可以通過(guò)串行 COM 端口進(jìn)行連接。該應(yīng)用程序本身是完全獨(dú)立的,即它是一個(gè)單一的jar文件,最終用戶可以將其復(fù)制到可能需要的位置,然后雙擊啟動(dòng)。RXTX 似乎打破了這個(gè)模型,因?yàn)樗枰趲?kù)路徑中包含額外的DLL或SO本機(jī)插件;如果無(wú)法使用本機(jī) Java 與串行端口進(jìn)行通信,我如何打包我的應(yīng)用程序(使用 ,aven),以便 RXTX 在運(yùn)行時(shí)可用,只需雙擊 Jar 文件即可。java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path: [__CLASSPATH__] thrown while loading gnu.io.RXTXCommDriver
查看完整描述

1 回答

?
小怪獸愛(ài)吃肉

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ì)象加載失敗。


查看完整回答
反對(duì) 回復(fù) 2023-07-28
  • 1 回答
  • 0 關(guān)注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)