将SmartID Reader JNI库添加到现有gradle项目中

天气ir3:

我正在尝试在现有项目中将Smart IDReader SDK试用版(https://habr.com/en/company/smartengines/blog/332670/)与Gradle(组装成war-archive的项目)一起使用。该应用程序工作站是centOS,我不需要支持本机库的所有体系结构。因此,我有libjniSmartIdEngine.so本机lib和jniSmartIdEngineJar.jar。同样在SDK c ++ * .h文件和* java SWIG类中。我正在尝试:

  1. 添加jar和/ resources /中的库。
  2. 在build.gradle依赖项中添加编译文件(“ lib / jniSmartIdEngineJar.jar”,“ libjniSmartIdEngine.so”)。
  3. 在我想使用提供的示例代码的类内的静态块中加载资源。

    静态{URL jniWrapper = SmartIDReader.class.getResource(“ / res / jniSmartIdEngineJar.jar”); System.load(jniWrapper.getPath()); }

Jar和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)

我所需要的一切-在我的项目中正确初始化了库,但我不知道如何。我找到了一些解决方案:* 向IntelliJ IDEA项目添加外部jar(lib / *。jar)的正确方法,建议在项目结构中手动添加依赖项(但是当我如上所述通过gradle添加它时,库是已经存在)/ * 如何在JAR内捆绑本机库和JNI库?这里建议用罐子,而不是战争。如果我理解正确,则无需解压缩库即可临时文件并加载它。

这是图书馆的亚军:

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 config替换该shell运行程序。

PS .:我正在Ubuntu上工作,并且该shell运行程序可以正常工作。我做错了什么?

天气ir3:

找到了解决方案:

  1. 要加载外部JNI库,必须将其添加到项目文件夹中(例如/ lib /)。
  2. 必须将JAR包装文件(在我的情况下生成的Swig)作为依赖项添加(右键单击jar>添加为库,或在项目结构模块中手动依赖项)。就我而言,我正在使用gradle

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

    在依赖项{}中

  3. 之后,jar中的类将在项目中可用,我们需要的所有内容-添加本机库。有几种方法:将-Djava.library.path = ...设置为JVM运行参数,或如下所述动态配置它:https : //habr.com/en/post/118027/另一种方法-放置系统文件夹中的库或在系统变量中添加新目录(Windows上的路径或Linux上的LD_LIBRARY_PATH)。此处的解释:如何为JNI加载本机库以避免UnsatisfiedLinkError?

关于shell脚本:在p.1中,我们必须在类路径LD_LIBRARY_PATH中为Linux指定jar-wrapper,或者要使用jvm能够找到本机库的另一个描述的解决方案。

最后一个-SmartId Reader没有ubuntu sdk,因此centOS软件包无法在ubuntu上运行(jvm SIGSEGV错误,问题帧:ld-linux-x86-64.so)。我只是使用Windows SDK,它解决了问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将现有的jni库(已编译为“ .so”)添加到另一个android studio项目中

将Maven性质添加到具有pom但没有Maven子菜单的现有Eclipse项目中

如何将pom.xml添加到现有的Eclipse项目中?

如何将Go代码添加到现有项目中

将单元测试添加到现有项目中?

将目录中存储的所有外部库添加到Qt项目中

将LibGDX添加到现有的Android Studio项目中

如何将监视模块添加到现有的Android Studio项目中?

将外键约束与现有表一起添加到Visual Studio数据库项目中的数据

将单元测试项目添加到现有的Qt Creator项目中

Xcode 8:如何将GIT存储库添加到现有项目

将Angular添加到现有的ASP.NET Web窗体项目中?

如何将JAR文件添加到现有gradle项目?

将Google地图添加到现有项目中会产生膨胀异常

将GraphicCircular Apple Watch复杂功能添加到现有Xcode项目中

将aspnetboilerplate.com添加到现有的角度项目中

如何将eslint添加到现有的vue-cli项目中?

如何将Angular项目添加到现有的.NET Core Web API项目中?

如何将平台添加到现有Flutter应用程序/项目中?

将Android库添加到项目中?

有条件地将文件添加到C ++项目中的库

将BuddySDK平台添加到包含RestKit的现有项目中

如何将scalatest依赖项添加到现有的scala / lift项目中?

将drupal添加到现有的Angular项目中

将WebAPI添加到现有的MVC项目中-获取404

使用dev将api添加到现有的rails项目中

如何将libgdx添加到现有的android studio项目中?

无法将具有现有 ID 的项目添加到数据库

如何将打字稿添加到现有的 vue3 项目中?