Продолжая исследовать 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 подключен - всеравно ошибка
}
Дело в том, что по умолчанию 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
Нет, Java ничего не блокирует. Просто вам нужно явно указать путь до внешней библиотеки (в вашем случае, iostream) используя:
-Djava.library.path="<path_to_lib>"
PS. В дополнение, можете посмотреть подобные вопросы и варианты их решения: https://stackoverflow.com/questions/11783632/how-do-i-load-and-use-native-library-in-java
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
ЗдравствуйтеЕсть код, он дает возможность открывать левую шторку и добавляет гамбургер
Есть связка приложение на java,spring, реализовываю функционал позволяющий из приложения по клику на ссылку документа(
Допустим, есть класс, реализующий некий интерфейсГде лучше писать комментарии к методам: в классе или в интерфейсе, или же и там, и там? Есть...