Java:d​​ll之间的切换取决于系统架构(32/64)

发布于 2024-10-25 01:46:37 字数 179 浏览 4 评论 0原文

我有一个 Java 程序使用一些 dll。由于这些嵌入的 dll 必须针对特定的系统架构(32 或 64 位)构建,我想创建一种方法/东西,允许我的程序在 32/64 位版本的 dll 之间切换(或者在程序运行时禁用库加载)在 64 位系统上)

我希望有一个不同于制作两个版本的程序的解决方案

提前致谢, 达米安

I have a Java program uses some dlls. As these embeded dlls have to be built for a specific system architecture (32 or 64bits) I want to make a method/something that allow my program to switch between 32/64 bits version of dlls (or disable the library load if the program run on a 64 bits system)

I hope there is a solution different from making two versions of the program

Thanks in advance,
Damien

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

那伤。 2024-11-01 01:46:37

使用系统属性:

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

Use system properties:

if ("x86".equals(System.getProperty("os.arch"))) {
   // 32 bit
} else if ("x64".equals(System.getProperty("os.arch"))) {
   // 64 bit
}
小糖芽 2024-11-01 01:46:37

您可以使用系统属性 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 上定义!

参考:

You can use the System Property 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
}

Careful: this property is defined on Sun VMs only!

Reference:

装迷糊 2024-11-01 01:46:37

一种蛮力的方法是跑步

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);

A brute force way is to run

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);
烈酒灼喉 2024-11-01 01:46:37

如果您使用 OSGi 和 JNI,则可以通过 Bundle-NativeCode 在清单中指定适合不同平台和架构的 DLL。

例如:

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

If you're using OSGi and JNI, you can specify the DLLs appropriate for different platforms and architectures in the manifest via Bundle-NativeCode.

For example:

    Bundle-NativeCode: libX.jnilib; osname=macOSX, X.dll;osname=win32;processor=x86
薆情海 2024-11-01 01:46:37

定义一个代表 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();
    }
}

Define a java interface that represents your DLL API and provide two implementations, one that calls the 32 bit DLL and another one that calls the 64 bit version:

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();
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文