を使用してMavenで構成されたJNIプロジェクトがありますnar-maven-plugin
。Java と C++ コードの両方がプロジェクトに存在します。メイン コードは適切にコンパイルされるようです (C++ と Java の両方)。問題はテスト コード (JUnit) にあります。
テスト コードは、それ自体がネイティブ メソッドを持つ 1 つの Java クラスを定義しました。対応するネイティブ コードはディレクトリにあります。
<project root>
+- src
+- test
+- c++
ビルド メッセージから、このネイティブ テスト コードがコンパイルされたことを示す証拠はなくnm
、ビルド プロセスによって作成された DLL をコマンド ラインから実行すると、対応するネイティブ メソッドがまったく表示されません。さらに、テスト コードに意図的に構文エラーを挿入し、コンパイル時にエラーが発生するかどうかを確認するために再コンパイルしました。コードがコンパイルされていないという私の信念と一致して、エラーはありません。
UnsatisfiedLinkError
それに応じて、テストが の間に実行されたときに を取得しmvn install
ます。テストが失敗した時点から、メイン (非テスト) コードのネイティブ メソッドが正しく読み込まれ、リンクされていることがわかります。したがって、特にネイティブ テスト コードのビルドとリンクに関連する問題があると結論付けています。
私は現在、ネイティブ コード用の Eclipse IDE と MinGW コンパイラを使用して Windows 10 を使用しています。
私の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>
この問題を処理する既知の方法はありますか? (おそらく追加の構成タグ?)