我正在尝试在现有项目中将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类中。我正在尝试:
在我想使用提供的示例代码的类内的静态块中加载资源。
静态{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运行程序可以正常工作。我做错了什么?
找到了解决方案:
必须将JAR包装文件(在我的情况下生成的Swig)作为依赖项添加(右键单击jar>添加为库,或在项目结构模块中手动依赖项)。就我而言,我正在使用gradle
compile fileTree(include: ['*.jar'], dir: 'lib')
在依赖项{}中
之后,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] 删除。
我来说两句