【发布时间】:2011-07-19 18:31:52
【问题描述】:
我有一个 Java 程序使用一些 dll。由于必须为特定的系统架构(32 位或 64 位)构建这些嵌入的 dll,我想创建一个方法/东西,允许我的程序在 32/64 位版本的 dll 之间切换(或者如果程序运行则禁用库加载在 64 位系统上)
我希望有一个不同于制作两个版本的程序的解决方案
提前致谢, 达米安
【问题讨论】:
标签: java dll 32bit-64bit switch-statement
我有一个 Java 程序使用一些 dll。由于必须为特定的系统架构(32 位或 64 位)构建这些嵌入的 dll,我想创建一个方法/东西,允许我的程序在 32/64 位版本的 dll 之间切换(或者如果程序运行则禁用库加载在 64 位系统上)
我希望有一个不同于制作两个版本的程序的解决方案
提前致谢, 达米安
【问题讨论】:
标签: java dll 32bit-64bit switch-statement
使用系统属性:
if ("x86".equals(System.getProperty("os.arch"))) {
// 32 bit
} else if ("x64".equals(System.getProperty("os.arch"))) {
// 64 bit
}
【讨论】:
您可以使用系统属性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
}
小心:此属性仅在 Sun 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);
【讨论】:
如果您使用 OSGi 和 JNI,您可以通过 Bundle-NativeCode 在清单中指定适用于不同平台和架构的 DLL。
例如:
Bundle-NativeCode: libX.jnilib; osname=macOSX, X.dll;osname=win32;processor=x86
【讨论】:
processor=86,一次用于processor=ARM_le(用于小端)或processor=ARM_be(用于大端)。这些值和其他值可以在osgi.org/Specifications/Reference#processor 的表中找到。
lib/x86/librxtxSerial.so; processor=x86, lib/arm/librxtxSerial.so; processor=ARM_le,但每次我得到同样的错误:No match found for native code: 。我做错了什么?
定义一个代表您的 DLL API 的 java 接口并提供两种实现,一种调用 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();
}
}
【讨论】: