Добавить библиотеку SmartID Reader JNI в существующий проект Gradle - PullRequest
1 голос
/ 25 февраля 2020

Я пытаюсь использовать пробную версию Smart IDReader SDK (https://habr.com/en/company/smartengines/blog/332670/) в моем существующем проекте с Gradle (проект собран в war-архив). Рабочая станция приложения - centOS, и мне не нужно поддерживать все архитектуры для нативных библиотек. Итак, у меня есть libjniSmartIdEngine.so нативный lib и jniSmartIdEngineJar.jar. Также в SDK представлены файлы c ++ * .h и классы *java SWIG. Что я пробую:

  1. добавить jar и т. Д. В /resources/.
  2. добавить файлы компиляции ('lib / jniSmartIdEngineJar.jar', 'libjniSmartIdEngine.so') в зависимости build.gradle.
  3. загрузить ресурс в блок 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, и этот модуль запуска работает нормально. Что я делаю не так?

1 Ответ

0 голосов
/ 26 февраля 2020

Нашел решение:

  1. Для загрузки внешней библиотеки JNI ее необходимо добавить в папку проекта (например, / lib /)
  2. Файл оболочки JAR (создан swig в моем случае) должен быть добавлен как зависимость (щелкните правой кнопкой мыши на jar> добавить как библиотеку или вручную в модулях структуры проекта Dependencies). В моем случае я использую gradle

        compile fileTree(include: ['*.jar'], dir: 'lib')
    

    в зависимостях {} block

  3. После этого классы из jar будут доступны в проекте и все, что нам нужно - добавить нативную библиотеку. Есть несколько способов: установить -D java .library.path = ... в качестве аргумента запуска JVM или настроить его на лету, как описано ниже: https://habr.com/en/post/118027/ Другой способ - просто поместить библиотеку в Системная папка или добавьте новый каталог в системную переменную (Путь на Windows или LD_LIBRARY_PATH на linux). Объяснение здесь: Как мне загрузить собственные библиотеки для JNI, чтобы избежать ошибки UnsatisfiedLinkError?

Относительно сценария оболочки: На стр. 1 мы добавляем jar-wrapper в наш должен быть указан classpath LD_LIBRARY_PATH для linux или другое описанное решение, где jvm сможет найти собственную библиотеку.

И последнее - SmartId Reader не имеет Ubuntu SDK, поэтому пакет centOS не работает в Ubuntu (Ошибка SIGSEGV jvm, проблемный c кадр: ld- linux -x86-64.so). Я просто использую windows SDK, это решило проблему.

...