nar-maven-plugin
を使用してMavenでJNIプロジェクトを設定しました。 JavaコードとC++コードの両方がプロジェクトに存在します。メインコードは明らかに正しくコンパイルされます(C++とJavaの両方)。問題はテストコード(JUnit)にあります。JUnitテストのネイティブコードが `nar-maven-plugin`でコンパイルされていません
テストコードは、それ自体がネイティブメソッドを持つ1つのJavaクラスを定義しました。対応するネイティブコードは、ディレクトリに存在
<project root>
+- src
+- test
+- c++
あり、このネイティブテストコードは、これまでにコンパイルされていることをビルドメッセージからの証拠はありませんし、私はコマンドラインからnm
を実行すると、対応するネイティブメソッドがまったく表示されません。ビルドプロセスによって作成されたDLL。また、私は意図的にテストコードに構文エラーを入れ、コンパイル時にエラーが発生するかどうかを再コンパイルします。コードは決してコンパイルされないという私の信念と一致して、エラーはありません。
これに対応して、mvn install
の間にテストを実行するとUnsatisfiedLinkError
となります。テストが失敗した時点から、メイン(非テスト)コードのネイティブメソッドが適切にロードされてリンクされていることがわかります。したがって、ネイティブテストコードの構築とリンクに関連する問題があると結論づけます。
私は現在、ネイティブコード用にEclipse IDEとMinGWコンパイラを使用しています。私のPOMの
関連するセクションは以下の通りです(少し早い設定の問題に関連しAvoiding machine-dependent POM with MinGW compiler and nar-maven-pluginに私の答えから更新):
<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>
この問題を処理するための既知の方法はありますか? (たぶん付加的な構成タグですか?)