javac “pas de fichiers source” en utilisant l’option -h

J’essaie d’expérimenter avec JNI et JDK 9. J’ai une classe NativeTest.java qui ressemble à ceci:

 public class NativeTest { static { System.loadLibrary("hello"); } private native void sayHello(); public static void main(Ssortingng[] args) { new NativeTest().sayHello(); } } 

Je comstack la classe, puis utilise javah NativeTest pour générer le fichier d’en-tête.

En émettant javah , je reçois cet avertissement:

 Warning: The javah tool is planned to be removed in the next major JDK release. The tool has been superseded by the '-h' option added to javac in JDK 8. Users are recommended to migrate to using the javac '-h' option; see the javac man page for more information. 

Je sais que la prochaine version majeure de JDK sera mise beaucoup de temps, mais je me suis dit que je commencerais maintenant à m’habituer à cette nouvelle option.

Donc, en essayant javac -h NativeTest.java (et d’autres variantes comme NativeTest , NativeTest.class , etc.), je continue à avoir cette erreur:

javac: no source files

Je n’ai trouvé aucune aide en ligne, probablement parce que cette fonctionnalité est relativement nouvelle et que je ne trouve rien à propos de cette nouvelle option -h dans la page de manuel.

Quelqu’un d’autre a déjà essayé? Qu’est-ce que je rate?

En Java 8, il fallait effectuer une étape intermédiaire de génération de fichiers de classe pour obtenir les en-têtes C

Disons que vous avez la structure suivante

 recipeNo001 ├── Makefile ├── README.md ├── c │  └── recipeNo001_HelloWorld.c ├── java │  └── recipeNo001 │  └── HelloWorld.java ├── lib └── target 

En Java (avant JDK 9), vous deviez comstackr une classe et utiliser javah avec des sources compilées

 > export JAVA_HOME=$(/usr/libexec/java_home -v 1.8.0_11) > ${JAVA_HOME}/bin/javac -d target java/recipeNo001/*.java > ${JAVA_HOME}/bin/javah -dc -cp target recipeNo001.HelloWorld # -dc -> put generated codes inside c directory # -cp target -> comstackd classes are inside target dir 

En Java 9, vous pouvez utiliser javac -h avec le code source Java.

 > export JAVA_HOME=$(/usr/libexec/java_home -v 9) > ${JAVA_HOME}/bin/javac -hc java/recipeNo001/HelloWorld.java # -hc -> create header file inside c directory 

La solution que j’ai découverte était que je ne spécifiais pas le répertoire dans lequel javac devait placer les fichiers d’en-tête.

Exécution de javac -h . NativeTest.java javac -h . NativeTest.java fonctionné.