1

我使用 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-unpackand mvn exec:java,但这并没有让我进步。(从该问题中描述的第一个获得相同的明显空结果,以及我在此处为第二个描述的相同异常。)

考虑的其他问题:

那么如何从命令行运行这个主程序呢?如果有一些预处理步骤来“提取”本机库,它是什么?如果它是自动的,那么我错过了什么?谢谢!

4

1 回答 1

1

我得到了一个小费,终于明白了!

这个依赖需要添加到 POM 中:

    <dependency>
        <groupId>org.scijava</groupId>
        <artifactId>native-lib-loader</artifactId>
        <version>2.2.0</version>
    </dependency>

之后我可以使用它运行它

mvn exec:java -Dexec.mainClass=com.myco.package.MainClass

尝试从命令行直接运行它java仍然崩溃,但在这种情况下它崩溃了,因为它没有找到依赖项的 jar。-cp如果我要使用标志为所有这些条目指定类路径条目,大概我现在可以在没有 maven 的情况下运行它。

于 2017-07-27T21:13:13.633 回答