#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 или метод, генерируется исключение. Найдите его и опубликуйте.