我使用 Eclipse 并使用nar-maven
插件在我的开发机器上构建了一个 JNI 项目。这可以在多种架构上编译,并给我留下.nar
文件。
我的问题是,现在我想在nar
. UnsatisfiedLinkError
当 Java 程序尝试加载应该在nar
文件中的本机库时,我不断收到消息。现在我意识到该.so
文件需要放在该文件上,java.library.path
但我的问题是我看不到在哪里指出这一点,因为唯一的副本不知何故在nar
文件中。我的印象是这将在幕后处理,因为我NarSystem.loadLibrary
在 Java 中使用自动生成的方法。
详情如下。
我的 POM 中配置nar
插件的部分:
<plugin>
<groupId>com.github.maven-nar</groupId>
<artifactId>nar-maven-plugin</artifactId>
<version>3.5.1</version>
<extensions>true</extensions>
<configuration>
<libraries>
<library>
<type>jni</type>
<narSystemPackage>com.myco.package</narSystemPackage>
</library>
</libraries>
</configuration>
</plugin>
在我的一个 Java 类中,我有一个静态初始化程序,它调用自动生成的方法来加载库:
static {
com.myco.package.NarSystem.loadLibrary();
}
运行后mvn install
,我在本地.m2/repository
目录的相应子目录中有以下文件:
maven-metadata-local.xml
_maven.repositories
project-0.0.1-arm-Linux-gpp-jni.nar
project-0.0.1.nar
project-0.0.1.pom
project-0.0.1-javadoc.jar
我尝试使用以下命令从命令行运行:
java -cp /home/myname/.m2/repository/com/myco/project/0.0.1/project-0.0.1.nar com.myco.package.MainClass
这开始运行相应的主程序,因此它找到了 Java 部分。当它到达应该加载本机库的地步时——上面的静态块——它会抛出错误
Exception in thread "main" java.lang.UnsatisfiedLinkError: no project-0.0.1 in java.library.path
这个问题,Nar dependency in multi-module maven project,看起来很接近,但答案取决于已经以某种方式“暴露”了本机库。我跟着提问者在那里尝试mvn nar:nar-unpack
and mvn exec:java
,但这并没有让我进步。(从该问题中描述的第一个获得相同的明显空结果,以及我在此处为第二个描述的相同异常。)
考虑的其他问题:
- Maven - UnsatisfiedLinkError with java.library.path似乎是关于在 maven 进程之外查找库。根据 maven 配置文件给出的答案,一旦我部署,这似乎没有帮助。
- maven-nar-plugin 和依赖模块中的测试这处理特定于运行测试的问题。
- nar-maven-plugin 和 native-library-loader 不加载本机库这个很接近,但无论如何都没有答案。似乎有所不同,因为该海报试图以某种方式在命令行上指定库路径。
- 在 webapp 中使用原生 Maven 工件 (nar)这是关于合并到 webapp 中的,所以它是不同的。它似乎确实提供了这个线索:“这两者都是作为 NAR 工件产生的,并且需要 maven-nar 插件才能使用。” 但是我还没有弄清楚该插件需要如何使用!
那么如何从命令行运行这个主程序呢?如果有一些预处理步骤来“提取”本机库,它是什么?如果它是自动的,那么我错过了什么?谢谢!