2011-03-21 30 views
1

我有一個Java程序使用了一些dll。由於這些嵌入式dll必須爲特定的系統架構(32位或64位)構建,因此我想創建一個方法/讓我的程序在32/64位版本的dll之間切換(或者在程序運行時禁用庫加載在64位系統)Java:在dll之間切換取決於系統架構(32/64)

我希望有一個從做兩個版本的程序提前

感謝, 達明

回答

6

使用系統屬性不同的解決方案:

if ("x86".equals(System.getProperty("os.arch"))) { 
    // 32 bit 
} else if ("x64".equals(System.getProperty("os.arch"))) { 
    // 64 bit 
} 
+1

好,和我的老PPC的Mac會發生什麼? – 2011-03-21 15:28:30

+3

只要再做一個?我認爲這個想法很清楚,這只是一個代碼示例。 – 2011-03-21 15:31:00

+0

os.arch在我的機器上是amd64 – mjaggard 2015-04-30 12:28:36

0

定義一個java接口代表您的DLL的API,並提供了兩種實現方式,一是調用32位的DLL和另一個調用64位版本:

public interface MyDll { 
    public void myOperation(); 
} 

public class My32BitDll implements MyDll { 
    public void myOperation() {    
     // calls 32 bit DLL 
    } 
} 

public class My64BitDll implements MyDll { 
    public void myOperation() {    
     // calls 64 bit DLL 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
     MyDll myDll = null; 

     if ("32".equals(args[0])) { 
      myDll = new My32BitDll(); 
     } else if ("64".equals(args[0])) { 
      myDll = new My64BitDll(); 
     } else { 
      throw new IllegalArgumentException("Bad DLL version"); 
     } 

     myDll.myOperation(); 
    } 
} 
+1

我懷疑這是OP想要的。它強制用戶告訴程序是否運行在32位或64位環境中。程序應該自己發現。 – 2015-03-11 18:34:19

1

如果您使用OSGi和JNI,您可以指定相應的DLL通過Bundle-NativeCode爲清單中的不同平臺和體系結構提供支持。

例如:

Bundle-NativeCode: libX.jnilib; osname=macOSX, X.dll;osname=win32;processor=x86 
+0

那些同名的圖書館呢?我必須爲ARM和x86體系結構導入rxtx庫,在這兩種情況下庫都稱爲librxtxSerial.so。我怎樣才能使用這個標題區分他們? – wyr0 2015-09-16 15:53:20

+0

@marbal - 我想你會列出庫兩次,一次爲'processor = 86',一次爲'processor = ARM_le'(用於little-endian)或'processor = ARM_be'(用於big-endian)。這些值和其他值可以在http://www.osgi.org/Specifications/Reference#processor的表格中找到。 – 2015-09-16 18:39:19

+0

我已經創建了一個名爲「lib」的文件夾和兩個名爲「x86」和「arm」的子文件夾,並且我在其中分別爲處理器x86和arm分別構建了庫。然後,在頭文件中,我寫了這個:'lib/x86/librxtxSerial.so; processor = x86,lib/arm/librxtxSerial.so;處理器= ARM_le'但每次我得到相同的錯誤:'找不到本機代碼的匹配:'。我做錯了什麼? – wyr0 2015-09-17 08:22:18

2

蠻力的方法是運行

boolean found = false; 
for(String library: libraries) 
    try { 
     System.loadLibrary(library); 
     found = true; 
     break; 
    } catch(UnsatisfiedLinkError ignored) { 
    } 
if(!found) throw new UnsatifiedLinkError("Could not load any of " + libraries);