Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> System.loadLibrary() - UnsatisfiedLinkError, Как правильно загрузить native - либу? 
V
    Опции темы
Temdegon
Дата 16.10.2008, 02:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: 7
Всего: 9



У меня есть моя сишная либа MyLib.dll, из которой с помощью JNI вызывается нужная мне native-функция.
подключаю ее в статическом блоке:

Код

static{
    System.loadLibrary("MyLib");



сам библиотека лежит в той же папке.
Код компилится. Если запустить из консоли, то все гуд: прила стартует, нативные функции вызываются и работает. Казалось бы, чего еще можно желать? Но в NetBeans почему-то это не прокатывает! при запуске получаю:
Код

Exception in thread "main" java.lang.UnsatisfiedLinkError: no MyLib in java.library.path

хотя dll-ка лежит во всех местах, где только можно: и в src, и build\classes.
Кроме того, если проект скомпилить в Jar, а потом запустить, то получаю тот же Exception, хотя если залезть в jar, то библиотека там есть, и лежит вроди как на своем месте (там же, где и class-файлы).
Обьясните пожалста, как решить эту проблему? Как правильно подключать библиотеки и куда их принято ложить? Можно конечно забить на это, и всю жизнь компилить из консоли, но ведь хочется удобства, да и jar в использовании намного удобнее чем куча class-ов  smile 
Погуглил немного на эту тему, но конкретного решения проблемы не нашел.  На сайте NetBeans нашел руководсво по jni, там написано:
Код

System.load("<PROJECTS_ROOT>\\HelloWorldNative\\dist\\HelloWorldNative.dll");

попробовал (естесно поменяв путь на свой) - результат тот же. Да и как-то это странно - подключать библиотеку относительно PROJECTS_ROOT.

PM MAIL   Вверх
Temdegon
Дата 16.10.2008, 04:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: 7
Всего: 9



Вроди как методом научного тыка решил проблему: что бы все запускалось из NetBeans, dll-ку нужно ложитьв в корень проекта. Если нужно запустить jar, то dll нужно положить в тот же каталог. 
Я так понял, что подключить dll, когда она лежит в jar-e никак не получится.
Может можно как-то иначе?

Может кому пригодится:
Во время разборок с jni наткнулся на такие грабли:
Библиотеку компилил взяв за основу какой-то простейший пример. Естественно, класс и библиотека назывались HelloNative. Разобравшись что и как, реализовал нужные функции и скомпилил библиотеку. Из класса HelloNative функция вызывается, все работает, я доволен как слон. Потом вернулся к тому прокетку, для которого и писал эту dll. Поленился что-то переименовывать и перекомпилировать библиотеку, так и подключил ее "как есть". А фиг - ничего не работает! Библиотека загружается, но при попытке вызова native-функции получаю java.lang.UnsatisfiedLinkError. Очень долго возился и не мог понять, почему не вызывается функция. После долгих мучений я понял что в сишном файле заголовок функции 
JNIEXPORT jstring JNICALL Java_HelloNative_greeting(JNIEnv * jenv, jclass jobj, jstring message)
означает не то, что эта функция находится в библиотеке HelloNative, а то что она должна вызываться из java-класса HelloNative!

PM MAIL   Вверх
powerOn
Дата 16.10.2008, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Цитата(Temdegon @  16.10.2008,  05:26 Найти цитируемый пост)
Вроди как методом научного тыка решил проблему: что бы все запускалось из NetBeans, dll-ку нужно ложитьв в корень проекта. Если нужно запустить jar, то dll нужно положить в тот же каталог. 


это значит что dll лежит в текущей (рабочей) директории, которой по умолчанию в NetBeans является корень проекта. Эту директорию можно настроить через свойства проекта, настройки запуска. Запуская jar самостоятельно, очевидно, что рабочей директорией у вас является папка где лежит jar.

Цитата(Temdegon @  16.10.2008,  05:26 Найти цитируемый пост)
Я так понял, что подключить dll, когда она лежит в jar-e никак не получится.


верно, никак не получится.




--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0651 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.