Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > System.loadLibrary() - UnsatisfiedLinkError


Автор: Temdegon 16.10.2008, 02:41
У меня есть моя сишная либа 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.

Автор: Temdegon 16.10.2008, 04:26
Вроди как методом научного тыка решил проблему: что бы все запускалось из 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!

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


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

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


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


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)