J'ai un projet JNI configuré avec Maven en utilisant le nar-maven-plugin
. Le code Java et le code C++ résident tous les deux dans le projet. Le code principal compile apparemment correctement (C++ et Java). Le problème est avec le code de test (JUnit).Le code natif pour les tests JUnit n'est pas compilé avec `nar-maven-plugin`
Le code de test a défini une classe Java qui possède elle-même une méthode native. Le code natif réside dans le répertoire
<project root>
+- src
+- test
+- c++
Il n'y a aucune preuve des messages de construction que ce code de test natif correspondant est jamais compilé et la méthode native correspondante ne semble pas du tout quand je lance nm
de la ligne de commande la DLL créée par le processus de construction. En outre, j'ai intentionnellement mis une erreur de syntaxe dans le code de test et recompilé pour voir si j'obtiendrais une erreur de compilation. Il n'y a pas d'erreur, cohérente avec ma conviction que le code n'est jamais compilé.
En conséquence, j'obtiens un UnsatisfiedLinkError
lorsque le test est exécuté pendant mvn install
. Notez que je peux dire à partir du moment où le test a échoué que les méthodes natives pour le code principal (non-test) ont été correctement chargées et liées. Par conséquent, je conclus qu'il y a un problème lié à la construction et à la liaison du code de test natif spécifiquement.
Je suis actuellement sur Windows 10 utilisant les compilateurs Eclipse IDE et MinGW pour le code natif.
Les sections pertinentes de mon POM sont ci-dessous (légèrement mis à jour de ma réponse sur Avoiding machine-dependent POM with MinGW compiler and nar-maven-plugin liée à un problème de configuration précoce):
<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>
Yat-il un moyen connu pour gérer ce problème? (Peut-être des balises de configuration supplémentaires?)