2017-10-05 7 views
0

Je suis en train d'expérimenter avec l'aide de la JNI et 9. Je JDK une classe NativeTest.java qui ressemble à ceci:javac « aucun fichier source » lors de l'utilisation option -h

public class NativeTest { 

    static { 
     System.loadLibrary("hello"); 
    } 

    private native void sayHello(); 

    public static void main(String[] args) { 
     new NativeTest().sayHello(); 
    } 
} 

compiler la classe, puis utilisez javah NativeTest pour générer le fichier d'en-tête.

Lors de la délivrance 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 ce sera un bon moment avant la prochaine version majeure JDK, mais je pensais que je commence à m'y habituer à cette nouvelle option maintenant .

donc à essayer javac -h NativeTest.java (et d'autres variations comme NativeTest, NativeTest.class, etc.) Je continue à obtenir cette erreur:

javac: no source files

Je n'ai pas été en mesure de trouver une aide en ligne, probablement parce que cela La fonctionnalité est relativement nouvelle, et je ne trouve rien à propos de cette nouvelle option -h dans la page de manuel.

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

+0

Ah, passons, je l'ai trouvé. Vous devez spécifier le répertoire dans lequel placer les fichiers d'en-tête. 'javac -h. NativeTest.java'. Je vais laisser la question au cas où quelqu'un d'autre se heurterait au même oubli. –

+0

Vous pouvez répondre à votre propre question et la marquer comme réponse acceptée. Cela permettra de réduire le nombre de questions sans réponse. – cup

Répondre

0

La solution que j'ai découverte était que je ne spécifiais pas le répertoire où javac devrait placer les fichiers d'en-tête.

Exécution javac -h . NativeTest.java travaillée.

0

Je ne suis pas sûr mais semble être votre dossier actuel d'où vous exécutez la commande javac et où votre fichier java NativeTest.java n'existe pas dans votre chemin d'accès système ou dans votre chemin de classe. Essayez simplement de le compiler sans l'option -h en premier. Vous pourriez obtenir la même erreur si le chemin de classe n'est pas défini.

1

En Java 8, il fallait faire étape intermédiaire de fichiers de classe de génération 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 compiler 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 -d c -cp target recipeNo001.HelloWorld 
# -d c  -> put generated codes inside c directory 
# -cp target -> compiled 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 -h c java/recipeNo001/HelloWorld.java 
# -h c  -> create header file inside c directory