Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > System.loadLibrary() - UnsatisfiedLinkError |
Автор: Temdegon 16.10.2008, 02:41 | ||||||
У меня есть моя сишная либа MyLib.dll, из которой с помощью JNI вызывается нужная мне native-функция. подключаю ее в статическом блоке:
сам библиотека лежит в той же папке. Код компилится. Если запустить из консоли, то все гуд: прила стартует, нативные функции вызываются и работает. Казалось бы, чего еще можно желать? Но в NetBeans почему-то это не прокатывает! при запуске получаю:
хотя dll-ка лежит во всех местах, где только можно: и в src, и build\classes. Кроме того, если проект скомпилить в Jar, а потом запустить, то получаю тот же Exception, хотя если залезть в jar, то библиотека там есть, и лежит вроди как на своем месте (там же, где и class-файлы). Обьясните пожалста, как решить эту проблему? Как правильно подключать библиотеки и куда их принято ложить? Можно конечно забить на это, и всю жизнь компилить из консоли, но ведь хочется удобства, да и jar в использовании намного удобнее чем куча class-ов ![]() Погуглил немного на эту тему, но конкретного решения проблемы не нашел. На сайте NetBeans нашел руководсво по jni, там написано:
попробовал (естесно поменяв путь на свой) - результат тот же. Да и как-то это странно - подключать библиотеку относительно 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! |