Это старый вопрос, но я нашел приемлемое решение, которое также должно быть переносимым, и я решил опубликовать ответ. Решение состоит в том, чтобы использовать JNA NativeLibrary#getInstance()
, потому что в Linux это будет передаваться RTLD_GLOBAL
в dlopen()
(а в Windows это не нужно).
Теперь, если вы используете эту библиотеку для реализации метода Java native
, вам также потребуется вызвать System.load()
(или Sysem.loadLibrary()
) в той же библиотеке после вызова NativeLibrary#getInstance()
.
Сначала ссылка на ошибку JNA: JNA-61
В комментарии там говорится, что в основном нужно загружать зависимости, прежде чем фактическая библиотека будет использовать изнутри JNA, а не стандартным способом Java. Я просто скопирую и вставлю свой код, это типичный сценарий :
String libPath =
"/path/to/my/lib:" + // My library file
"/usr/local/lib:" + // Libraries lept and tesseract
System.getProperty("java.library.path");
System.setProperty("jna.library.path", libPath);
NativeLibrary.getInstance("lept");
NativeLibrary.getInstance("tesseract");
OcrTesseractInterf ocrInstance = (OcrTesseractInterf)
Native.loadLibrary(OcrTesseractInterf.JNA_LIBRARY_NAME, OcrTesseractInterf.class);
Я написал небольшую библиотеку для обеспечения возможности распознавания текста моим приложением Java с использованием Tesseract. Тессеракт зависит от Leptonica, поэтому для использования моей библиотеки мне нужно сначала загрузить библиотеки lept и tesseract . Загрузка библиотек стандартными средствами (System.load () и System.loadLibrary ()) не помогает, как и установка свойств jna.library.path или java.library. путь . Очевидно, JNA любит загружать библиотеки по-своему.
Это работает для меня в Linux, я думаю, если установить правильный путь к библиотеке, это должно работать и в других ОС.