Я пытаюсь использовать пробную версию Smart IDReader SDK (https://habr.com/en/company/smartengines/blog/332670/) в моем существующем проекте с Gradle (проект собран в war-архив). Рабочая станция приложения - centOS, и мне не нужно поддерживать все архитектуры для нативных библиотек. Итак, у меня есть libjniSmartIdEngine.so нативный lib и jniSmartIdEngineJar.jar. Также в SDK представлены файлы c ++ * .h и классы *java SWIG. Что я пробую:
- добавить jar и т. Д. В /resources/.
- добавить файлы компиляции ('lib / jniSmartIdEngineJar.jar', 'libjniSmartIdEngine.so') в зависимости build.gradle.
загрузить ресурс в блок stati c внутри моего класса, где я хочу использовать предоставленный пример кода.
stati c {URL jniWrapper = SmartIDReader. class.getResource ( "/ RES / jniSmartIdEngineJar.jar"); System.load (jniWrapper.getPath ()); }
Jar and So помещены в одну папку, и у меня ошибка:
It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.Exception in thread "main" java.lang.UnsatisfiedLinkError: /jniSmartIdEngineJar.jar: /jniSmartIdEngineJar.jar: invalid ELF header (Possible cause: endianness mismatch)
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824)
at java.lang.Runtime.load0(Runtime.java:809)
at java.lang.System.load(System.java:1086)
Все, что мне нужно - это правильно инициализировать библиотеку в моем проекте, и я не не понимаю как. Я нашел несколько решений: * Правильный способ добавить внешние jar (lib / *. Jar) в проект IntelliJ IDEA с предложением добавить зависимости вручную в структуру проекта (но когда я добавляю это gradle как описано выше, библиотеки уже есть) / * Как связать нативную библиотеку и библиотеку JNI внутри JAR? и здесь предложение для jar, а не war. Если я правильно понял, мне не нужно разархивировать библиотеку для временного файла и загрузить ее.
Вот бегунок для библиотеки:
javac *.java -cp ../../bindings/java/jniSmartIdEngineJar.jar
for image in ../../testdata/*; do
config=$(ls ../../data-zip/*.zip) # assuming one file
for document_types in "rus.passport.*" "mrz.*" "rus.drvlic.*" "*"; do
LD_LIBRARY_PATH=../../bin LC_ALL=en_US.utf-8 java -cp ../../bindings/java/jniSmartIdEngineJar.jar:. Main "$image" "$config" "$document_types"
done
done
Пожалуйста, объясните, как я могу это использовать внешняя библиотека JNI в моем проекте. И как я могу заменить этот модуль оболочки на конфигурацию Gradle.
PS. Я работаю над Ubuntu, и этот модуль запуска работает нормально. Что я делаю не так?