java.lang.UnsatisfiedLinkError: Can't find dependent libraries - iostream

310
19 августа 2017, 00:35

Продолжая исследовать JNI столкнулся с таким моментом: в файлах в которых я описываю реализацию методов(cpp), при подключении iostream после сборки библиотеки (которая проходит нормально) в ходе выполнения java при попытке загрузить либу ловлю java.lang.UnsatisfiedLinkError: Can't find dependent libraries Опытным путем выяснил что это iostream (убираю его и все работает).

Вопрос такой, это ограничение связанное с потоками вывода (java как то это дело блокирует или контролирует) или есть какая то хитрость ?

проблемный код:

//#include <iostream>// как только подключаю - ошибка 
#include <windows.h>// для проверки того что другие либы импортятся
#include <conio.h>// для проверки того что другие либы импортятся
#include "implementation.h"

JNIEXPORT void JNICALL voidMethod_impl(JNIEnv *env, jobject obj) {
printf("%s", "printf test");
//    std::cout<<"test cout\n";// даже если это закомментировано а iostream подключен - всеравно ошибка
}
Answer 1

Дело в том, что по умолчанию gcc линкует вашу dll'ку динамически с библиотеками libgcc, libstdc++ и libwinpthread. Соответственно, есть несколько способов ошибку не получать.

Во-первых, можно положить dll'ки этих библиотек в каталог присутствующий в переменной окружения PATH.

Во-вторых, при запуске программы передать JVM параметр java.library.path, содержащий пути как к вашей dll'ке, так и к dll'кам необходимых библиотек:

java -Djava.library.path=.;D:\PROGRAMS\mingw64_7_1\bin com.example.Main

В-третьих, можно слинковать эти библиотеки с вашей статически. Самый простой способ - передать компилятору параметр -static, но тогда он запихнёт в вашу dll'ку всё, что ему покажется необходимым.

Или можно явно указать, какие библиотеки необходимы:

g++ -Wl,--add-stdcall-alias ^
-I"%JAVA_HOME%\include" ^
-I"%JAVA_HOME%\include\win32" ^
-L"%MINGW_HOME%\lib\gcc\x86_64-w64-mingw32\lib" ^
-shared -o example.dll Example.cpp ^
-static-libgcc -static-libstdc++ ^
-Wl,-Bstatic -lstdc++ -lpthread
Answer 2

Нет, Java ничего не блокирует. Просто вам нужно явно указать путь до внешней библиотеки (в вашем случае, iostream) используя:

-Djava.library.path="<path_to_lib>"

PS. В дополнение, можете посмотреть подобные вопросы и варианты их решения: https://stackoverflow.com/questions/11783632/how-do-i-load-and-use-native-library-in-java

READ ALSO
Navigation Drawer в нескольких активити

Navigation Drawer в нескольких активити

ЗдравствуйтеЕсть код, он дает возможность открывать левую шторку и добавляет гамбургер

297
WebDav и libreoffice 5.3.4 не приходит PUT запрос от libreoffice

WebDav и libreoffice 5.3.4 не приходит PUT запрос от libreoffice

Есть связка приложение на java,spring, реализовываю функционал позволяющий из приложения по клику на ссылку документа(

209
Комментирование методов

Комментирование методов

Допустим, есть класс, реализующий некий интерфейсГде лучше писать комментарии к методам: в классе или в интерфейсе, или же и там, и там? Есть...

230