Java: переключение между DLL зависит от архитектуры системы (32/64) - PullRequest
1 голос
/ 21 марта 2011

У меня Java-программа использует несколько DLL. Поскольку эти встроенные библиотеки DLL должны быть построены для конкретной архитектуры системы (32 или 64 бита), я хочу создать метод / нечто, позволяющее моей программе переключаться между 32/64-битными версиями библиотек DLL (или отключать загрузку библиотеки, если программа запускается). в 64-битной системе)

Надеюсь, есть решение, отличное от создания двух версий программы

Спасибо заранее, Дэмиен

Ответы [ 5 ]

6 голосов
/ 21 марта 2011

Использовать системные свойства:

if ("x86".equals(System.getProperty("os.arch"))) {
   // 32 bit
} else if ("x64".equals(System.getProperty("os.arch"))) {
   // 64 bit
}
3 голосов
/ 21 марта 2011

Вы можете использовать системное свойство 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!

Ссылка:

2 голосов
/ 21 марта 2011

Путь грубой силы - бежать

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);
1 голос
/ 21 марта 2011

Если вы используете OSGi и JNI, вы можете указать библиотеки DLL, подходящие для разных платформ и архитектур, в манифесте через Bundle-NativeCode.

Например:

    Bundle-NativeCode: libX.jnilib; osname=macOSX, X.dll;osname=win32;processor=x86
0 голосов
/ 21 марта 2011

Определите Java-интерфейс, который представляет ваш API-интерфейс DLL и предоставляет две реализации: одну, которая вызывает 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();
    }
}
...