web-dev-qa-db-fra.com

Erreur de l'outil Javah: impossible de trouver le fichier de classe pour hellojni

J'essaie de créer un fichier d'en-tête à l'aide de l'outil javah à partir de la ligne de commande sur le système d'exploitation Windows 7, mais j'échoue tout le temps.

J'ai suivi différentes façons et j'ai même lu la documentation de l'outil javah d'Oracle, mais ils n'ont pas aidé à résoudre ce problème.

Mon fichier de classe (hellojni.class) et Java (hellojni.Java) les deux sont à la racine de D:\ conduire.

Mais chaque fois que je lance l'outil javah, cela me donne une erreur:

n'a pas pu trouver le fichier de classe pour hellojni

J'ai essayé en fournissant également classpath mais sans obtenir de fichier d'en-tête.

31
S.S Sahota

Je soupçonne que le problème est que votre classe a un package et vous essayez d'exécuter la commande à partir du répertoire avec le fichier de classe au lieu de la racine du package.

L'exemple de Samhain fonctionne parce que son MyClass.Java ne contient aucun paquet, alors que je soupçonne le vôtre.

Par exemple, supposons que nous ayons le fichier suivant à c:\src\com\example\MyClass.Java

package com.example;

public class MyClass {
    public native void myMethod();
}

Accédez à la ligne de commande et exécutez ce qui suit:

c:\src\com\example>javac MyClass.Java

c:\src\com\example>dir

 Directory of C:\src\com\example

2015-02-23  03:17 PM    <DIR>          .
2015-02-23  03:17 PM    <DIR>          ..
2015-02-23  03:20 PM               219 MyClass.class
2015-02-23  03:17 PM                84 MyClass.Java

c:\src\com\example>javah MyClass
Error: Could not find class file for 'MyClass'.

c:\src\com\example>cd c:\src

c:\src>javah com.example.MyClass

c:\src>dir
 Directory of C:\src

2015-02-23  03:18 PM    <DIR>          .
2015-02-23  03:18 PM    <DIR>          ..
2015-02-23  03:16 PM    <DIR>          com
2015-02-23  03:18 PM               449 com_example_MyClass.h

Succès!

102
hendalst

javah -classpath path_to_jars_or_classes com.my.package.MyClass.

Si vous exécutez avec -verbose, javah -verbose -classpath path_to_jars_or_classes com.my.package.MyClass, il vous montrera le chemin de recherche qu'il utilise pour localiser vos classes. Vous pouvez l'utiliser pour valider si votre répertoire, D: \, est répertorié.

Voir Documentation javah

Exemple: le fichier est nommé MyClass.Java, le nom de classe interne est MyClass. Aucune erreur.

C:\>more MyClass.Java
public class MyClass
{
   public static void doSomething(int b)
   {
      return;
   }
}

C:\>javac MyClass.Java

C:\>javah -classpath C:\ MyClass

C:\>dir *.h
 Volume in drive C has no label.
 Volume Serial Number is XXXX-XXXX

 Directory of C:\

10/07/2013  11:46 AM               242 MyClass.h
               1 File(s)            242 bytes
               0 Dir(s)  X bytes free
8
Samhain

J'ai également rencontré le même problème lors de la tentative de compilation et de génération de l'en-tête C/C++ en deux étapes pour une implémentation Java Native Interface (JNI) (je soupçonne que c'est ce que vous essayez de faire à partir de la noms de fichiers). Pour moi, la solution a été de fusionner les deux étapes en une à l'aide de la commande suivante:

javac YOUR_CLASS_FILE_NAME.Java -h .

Le point (.) Inclut le chemin actuel. Cette commande ne peut être exécutée qu'à partir de Java 8.

2
Abdel Aleem

Supposons que votre fichier de classe se trouve dans le dossier D:/A cd votre commande Invite dans le dossier A et exécutez la commande ci-dessous

D:/A> javah -classpath. nomfichierclasse

Ici . définira le chemin de classe sur le répertoire courant et l'outil javah devrait être capable de trouver votre fichier de classe.

1
Pratap Singh

Sous MacOS X, il fallait la variable classpath. Cela pourrait être la solution si elle peut également être vérifiée sur d'autres plates-formes.

$ javah -verbose Article.HelloJNICpp
$ javah -verbose -classpath ./ Article.HelloJNICpp
[Creating file RegularFileObject[Article_HelloJNICpp.h]]
$ 
1
Rock

Si vous utilisez Eclipse: ajoutez -classpath PATH_OF_PACKAGE_TOP dans javah CLASSNAME

Exemple:javah -classpath . com.byf.test.JNI

my tree : `
.
├── com
│   └── byf
│       └── test
│           └── JNI.Java
└── libcall.so`


result:`
    byf@byf-Ubuntu:~/code/workspace_Eclipse_Java/JAVA_YF/src$ javah -classpath . com.byf.test.JNI
    byf@byf-Ubuntu:~/code/workspace_Eclipse_Java/JAVA_YF/src$ ls
    com  com_byf_test_JNI.h  libcall.so
    byf@byf-Ubuntu:~/code/workspace_Eclipse_Java/JAVA_YF/src$ cat com_byf_test_JNI.h 
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class com_byf_test_JNI */

    #ifndef _Included_com_byf_test_JNI
    #define _Included_com_byf_test_JNI
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     com_byf_test_JNI
     * Method:    add
     * Signature: (II)I
     */
    JNIEXPORT jint JNICALL Java_com_byf_test_JNI_add
      (JNIEnv *, jclass, jint, jint);

    #ifdef __cplusplus
    }
    #endif
    #endif
    `
1
Riven666666666