我有一個Java程序使用了一些dll。由於這些嵌入式dll必須爲特定的系統架構(32位或64位)構建,因此我想創建一個方法/讓我的程序在32/64位版本的dll之間切換(或者在程序運行時禁用庫加載在64位系統)Java:在dll之間切換取決於系統架構(32/64)
我希望有一個從做兩個版本的程序提前
感謝, 達明
我有一個Java程序使用了一些dll。由於這些嵌入式dll必須爲特定的系統架構(32位或64位)構建,因此我想創建一個方法/讓我的程序在32/64位版本的dll之間切換(或者在程序運行時禁用庫加載在64位系統)Java:在dll之間切換取決於系統架構(32/64)
我希望有一個從做兩個版本的程序提前
感謝, 達明
使用系統屬性不同的解決方案:
if ("x86".equals(System.getProperty("os.arch"))) {
// 32 bit
} else if ("x64".equals(System.getProperty("os.arch"))) {
// 64 bit
}
定義一個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();
}
}
我懷疑這是OP想要的。它強制用戶告訴程序是否運行在32位或64位環境中。程序應該自己發現。 – 2015-03-11 18:34:19
如果您使用OSGi和JNI,您可以指定相應的DLL通過Bundle-NativeCode爲清單中的不同平臺和體系結構提供支持。
例如:
Bundle-NativeCode: libX.jnilib; osname=macOSX, X.dll;osname=win32;processor=x86
那些同名的圖書館呢?我必須爲ARM和x86體系結構導入rxtx庫,在這兩種情況下庫都稱爲librxtxSerial.so。我怎樣才能使用這個標題區分他們? – wyr0 2015-09-16 15:53:20
@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
我已經創建了一個名爲「lib」的文件夾和兩個名爲「x86」和「arm」的子文件夾,並且我在其中分別爲處理器x86和arm分別構建了庫。然後,在頭文件中,我寫了這個:'lib/x86/librxtxSerial.so; processor = x86,lib/arm/librxtxSerial.so;處理器= ARM_le'但每次我得到相同的錯誤:'找不到本機代碼的匹配:'。我做錯了什麼? – wyr0 2015-09-17 08:22:18
您可以使用系統屬性sun.arch.data.model
String dataModel = System.getProperty("sun.arch.data.model");
if("32").equals(dataModel){
// load 32-bit DLL
}else if("64").equals(dataModel){
// load 64-bit DLL
}else{
// error handling
}
小心:此屬性只在太陽的VM定義!
參考:
蠻力的方法是運行
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);
好,和我的老PPC的Mac會發生什麼? – 2011-03-21 15:28:30
只要再做一個?我認爲這個想法很清楚,這只是一個代碼示例。 – 2011-03-21 15:31:00
os.arch在我的機器上是amd64 – mjaggard 2015-04-30 12:28:36