我有一个使用 Maven 配置的 JNI 项目nar-maven-plugin
。Java 和 C++ 代码都驻留在项目中。主要代码显然可以正确编译(C++ 和 Java)。问题在于测试代码(JUnit)。
测试代码定义了一个本身具有本地方法的 Java 类。对应的本机代码驻留在目录中
<project root>
+- src
+- test
+- c++
nm
构建消息中没有证据表明该本地测试代码曾经被编译过,并且当我从命令行运行构建过程创建的 DLL时,根本不会出现相应的本地方法。另外,我故意将语法错误放入测试代码中并重新编译以查看是否会出现编译时错误。没有错误,这与我认为代码永远不会编译的信念一致。
相应地,我UnsatisfiedLinkError
在mvn install
. 请注意,我可以从测试失败的那一点看出,主(非测试)代码的本机方法已正确加载和链接。因此,我得出的结论是,存在一些与本机测试代码的构建和链接相关的问题。
我目前在 Windows 10 上使用 Eclipse IDE 和 MinGW 编译器获取本机代码。
我的 POM 的相关部分如下(根据我关于使用 MinGW 编译器和 nar-maven-plugin 避免与机器相关的 POM 与早期配置问题相关的回答略有更新):
<profiles>
<profile>
<id>Windows-MinGW</id>
<activation>
<os>
<family>Windows</family>
</os>
</activation>
<build>
<plugins>
<plugin>
<groupId>com.github.maven-nar</groupId>
<artifactId>nar-maven-plugin</artifactId>
<version>3.5.1</version>
<extensions>true</extensions>
<configuration>
<cpp>
<options>
<option>-std=c++1y</option>
</options>
</cpp>
<linker>
<name>g++</name>
<options>
<option>-Wl,--kill-at</option>
</options>
</linker>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<build>
<defaultGoal>integration-test</defaultGoal>
<plugins>
<plugin>
<groupId>com.github.maven-nar</groupId>
<artifactId>nar-maven-plugin</artifactId>
<version>3.5.1</version>
<extensions>true</extensions>
<configuration>
<cpp>
<defines>
<define>EXPORT_DLL</define>
</defines>
</cpp>
<libraries>
<library>
<type>jni</type>
<narSystemPackage>com.mycompany.sandbox</narSystemPackage>
</library>
</libraries>
</configuration>
</plugin>
</plugins>
</build>
有没有已知的方法来处理这个问题?(也许额外的配置标签?)