запуск файла .jar на основе JNI в JVM

#java #dll #java-native-interface

#java #dll #java-native-interface

Вопрос:

У меня есть написанная мной java-программа, которая использует некоторые собственные методы через JNI. мой java-код в основном реализует графический интерфейс для вызова собственных методов из моей .dll. кажется, все работает нормально, когда я запускаю код из своей IDE (netbeans), но когда я пытаюсь запустить файл .jar, он не работает.похоже, я не могу получить доступ к методам .dll.

я скомпилировал программу Java с 32-разрядной библиотекой по соображениям совместимости (хотя я использую 64-разрядную версию windows7). я попытался запустить файл .jar на 32-разрядной платформе Java, но графический интерфейс даже не отображался так, как обычно при использовании 64-разрядной версии. я также просто использую команду «system.loadlibrary», поэтому путь к .dll должен быть относительным.

я получаю сообщение об ошибке «не удается загрузить 32-разрядный IA.dll на 64-разрядной платформе AMD … бла-бла-бла «. когда я запускаю 32-разрядную версию java, она говорит «невозможно получить доступ к jarfile …». есть ли какой-нибудь способ обойти это? тот факт, что программа запускается из моей ide, заставляет меня думать, что должен быть способ для этого. в идеале я бы хотел, чтобы моя программа также работала на 32-разрядных машинах, поэтому я не хочу делать программу 64-разрядной.

кроме того, компилятор выдает предупреждение «путь к классу начальной загрузки не задан в сочетании с исходным кодом 1.6», но я не уверен, имеет ли это какое-либо отношение к моей проблеме.

Ответ №1:

Системное свойство java.library.path определяет пути, которые Java просматривает при загрузке библиотек System.loadLibrary() . В Windows по умолчанию это будет текущий каталог (т. Е. Каталог, Из которого было запущено приложение), а также каталог JRE bin и каталог system32 Windows.

Вы могли бы попробовать ввести аргументы -Djava.library.path=<path to your DLL file> при запуске JVM и посмотреть, имеет ли это значение.

Вы также можете принудительно загрузить файл библиотеки, используя System.load() вместо этого абсолютный путь.

Ответ №2:

Я попытался скопировать .dll в каталог windows/ system32

Нет.

каталог java/jdk1.7.0/bin

Должно было сработать, но не в том месте.

и в тот же каталог, что и .jar

Нет.

Лучшее место для библиотек DLL JNI находится в текущем каталоге при выполнении файла JAR.

но ни одно из них не устранило проблему.

В чем проблема? Вы еще не предоставили сообщение об ошибке.

Комментарии:

1. @Ben Если вы не нашли в нем DLL или метод, генерируется исключение. Найдите его и опубликуйте.