Java и JNI - загрузка библиотек dll работает только на моем компьютере - PullRequest
1 голос
/ 19 января 2011

Я сталкиваюсь с некоторыми раздражающими проблемами, чтобы заставить мое java-приложение работать с внешними библиотеками c ++ через JNI.Библиотеки расположены внутри пакетов.Я копирую их во временную папку, когда мне нужно загрузить их в виртуальную машину.Это следующие библиотеки:

libcurld.dll;libfftw3f-3.dll;libmad.dll;libsamplerate.dll;main.dll;

Файл main.dll - это тот, который реализует собственный метод, объявленный на стороне Java.Это DLL зависит от вышеупомянутого, чтобы работать должным образом.Я только скомпилировал main.ddl для visual studio, один двоичный файл для 7, другой для xp.Другие были загружены и просто связаны.Я запускаю следующий метод для загрузки библиотек в java:

public static boolean loadBinaries(){
    String os = System.getProperty("os.name").toLowerCase();
    ArrayList<String> bins = new ArrayList<String>();

    if(os.indexOf("windows 7") >= 0){
        bins.add("/nm/metadata/bin/win/libcurld.dll");
        bins.add("/nm/metadata/bin/win/libfftw3f-3.dll");
        bins.add("/nm/metadata/bin/win/libmad.dll");
        bins.add("/nm/metadata/bin/win/libsamplerate.dll");
        bins.add("/nm/metadata/bin/win/seven/main.dll");
    }
    else if(os.indexOf("windows xp") >= 0){
        bins.add("/nm/metadata/bin/win/libcurld.dll");
        bins.add("/nm/metadata/bin/win/libfftw3f-3.dll");
        bins.add("/nm/metadata/bin/win/libmad.dll");
        bins.add("/nm/metadata/bin/win/libsamplerate.dll");
        bins.add("/nm/metadata/bin/win/xp/main.dll");
    }

    File f = null;
    for(String bin : bins){
        InputStream in = FileManager.class.getResourceAsStream(bin);
        byte[] buffer = new byte[1024];
        int read = -1;
        try {
            String[] temp = bin.split("/");
            f = new File(TEMP_FOLDER + "/" + temp[temp.length-1]);
            File realF = new File(f.getAbsolutePath());
            if(realF.exists())
                f.delete();

            FileOutputStream fos = new FileOutputStream(realF);

            while((read = in.read(buffer)) != -1) {
                fos.write(buffer, 0, read);
            }
            fos.close();
            in.close();

            System.load(f.getAbsolutePath());
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    return true;
}

Исполняемый файл jar всегда отлично работает на моей машине, но не на других ... Я получил следующие ошибки из своих тестов:

(xp)
Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\temp\main.dll: Can't find dependent libraries at java.lang.ClassLoader$NativeLibrary.load(Native Method)...

(seven)
C:\temp\main.dll: The application has failed to start because its side-by-side configuration is incorrect...

Все dll хорошо написаны во временной папке, и, как я уже сказал, это хорошо работает на моем компьютере.Я думал, что это может быть потому, что компиляция в режиме отладки на VS.К сожалению, обращение к релизу ничего не изменило, если только не вернуть меньшие двоичные файлы.

Что это может быть?В Visual Studio отсутствуют некоторые детали конфигурации?Заранее спасибо.

1 Ответ

1 голос
/ 19 января 2011

Сначала я скопировал бы все библиотеки DLL, а затем загрузил их в два цикла.

Во-вторых, из сообщения об ошибке кажется, что существует еще одна DLL, которая требуется main.dll, которой нет на других машинах. Это могут быть библиотеки времени выполнения C ++, которые часто не устанавливаются в нужной вам версии, поэтому многие игры или другие приложения устанавливают их в первую очередь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...