Erreur Javah en l'utilisant dans JNI

Commande:

javah -jni JavaHowTo

Résultat:

error: cannot access JavaHowTo 
class file for JavaHowTo not found

javadoc: error - Class JavaHowTo not found.
Error: No classes were specified on the command line.  Try -help.

j'ai configuré le chemin de classe correctement, mais j'obtiens quand même ceci javah erreur.

ce sera bien utile.

44
demandé sur madth3 2009-06-12 15:58:08

14 réponses

javah -jni com.example.JavaHowTo

com.example est votre paquet.

Vous devez également exécuter javah à partir du répertoire contenant com/example/JavaHowTo.class

par exemple, si votre structure est

/home/user/com/example/JavaHowTo.class

exécuter javah de

/home/user
81
répondu Glen 2017-08-16 20:34:20

La suite travaillé pour moi (Win7):

javah -classpath bin/classes -jni -d jni com.my.javaclass

Je l'exécute à partir du répertoire principal de l'application.

Le problème était dans le sous-répertoire classes

13
répondu jankos 2012-04-01 15:04:04

j'utilise javah avec succès tous les jours à partir de mes scripts de construction avec les options suivantes:

javah -d <outputdir> -classpath <classpath> <fully_qualified_class>

où:

'outputdir' is the directory where to put the generated header file

'classpath' contains an absolute path to the directory containing your root package (as mentionned by Glen)

'fully_qualified_class' is the name of the class containing native methods without .class extension

-jni option n'est pas requis (définir par défaut)

quoi qu'il en soit, vous devriez vérifier que votre fichier class a été généré: plutôt surpris que vous obteniez une erreur javadoc aussi...

11
répondu dilig0 2009-06-12 13:20:48

j'ai rencontré le même message d'erreur et à l'aide de http://www.inonit.com/cygwin/jni/helloWorld/header.html lien que j'ai été en mesure de réussir à générer l' .h fichier. J'ai utilisé la commande suivante

C:\Program Files\Java\jdk1.6.0_21\bin>javah -d C:\Prachi\Android\Workspace_QP_re
structure\HelloWorld\bin\example\jni -classpath C:\Prachi\Android\Workspace_QP_r
estructure\HelloWorld\bin example.jni.HelloWorld

ici exemple.jni est mon nom de paquet et C:\Prachi\Android\Workspace_QP_re structure\ est l'endroit où mon chemin de l'espace de travail eclipse.

j'Espère que cela vous aide

9
répondu Prachi Shrivastava 2011-06-07 10:04:23

j'ai eu ce problème quand j'ajoute à-classpath mon source répertoire. Je pensais que les cours étaient en *.fichiers java ;)

Javah travaille sur le code octet donc vous devez ajouter un répertoire avec vos binaires à classpath

j'ai fait quelques eclipse tâche:

"Emplacement"

${env_var:JAVA_HOME}\bin\javah.exe

"Arguments"

-verbose 
-force
-classpath ;${project_loc}\bin
-d ${project_loc}\jni 
${java_type_name}

Sélectionner un fichier et de l'Exécuter

4
répondu Konrad Nowicki 2010-12-21 12:20:22

dans mon cas, le problème était assez stupide.. J'essaie: javah com.AAA.BBB.ClassName.classe

sans ".catégorie" je générer le .h fichier correctement

javah com.AAA.BBB.ClassName

3
répondu Marco McRoni 2011-12-29 09:36:48

j'ai eu des problèmes similaires et utilisé l'option-verbose. J'ai dû ajouter un ; à l'avant de l'option classpath.

C:\Projects\HelloWorld\src>javah -verbose -classpath c:\projects\HellowWorld\build\classes helloworld.HelloWorld
error: cannot access helloworld.HelloWorld
class file for helloworld.HelloWorld not found
javadoc: error - Class helloworld.HelloWorld not found.
[ Search Path: c:\jdk\jre\lib\resources.jar;c:\jdk\jre\lib\rt.jar;c:\jdk\jre\lib    \sunrsasign.jar;c:\jdk\jre\lib\jsse.jar;c:\jdk\jre\lib\jce.jar;c:\jdk\jre\lib\ch    arsets.jar;c:\jdk\jre\classes\c:\projects\HellowWorld\build\classes ]
Error: No classes were specified on the command line.  Try -help.

C:\Projects\HelloWorld\src>javah -verbose -classpath ;c:\projects\HellowWorld\build\classes helloworld.HelloWorld
[ Search Path: c:\jdk\jre\lib\resources.jar;c:\jdk\jre\lib\rt.jar;c:\jdk\jre\lib\sunrsasign.jar;c:\jdk\jre\lib\jsse.jar;c:\jdk\jre\lib\jce.jar;c:\jdk\jre\lib\charsets.jar;c:\jdk\jre\classes\;c:\projects\HellowWorld\build\classes ]
[Creating file helloworld_HelloWorld.h]
[search path for source files: .,c:\projects\HellowWorld\build\classes]
[search path for class files: c:\jdk\jre\lib\resources.jar,c:\jdk\jre\lib\rt.jar,c:\jdk\jre\lib\sunrsasign.jar,c:\jdk\jre\lib\jsse.jar,c:\jdk\jre\lib\jce.jar,c:\jdk\jre\lib\charsets.jar,c:\jdk\jre\classes,c:\jdk\jre\lib\ext\dnsns.jar,c:\jdk\jre\lib\ext\localedata.jar,c:\jdk\jre\lib\ext\sunjce_provider.jar,c:\jdk\jre\lib\ext\sunmscapi.jar,c:\jdk\jre\lib\ext\sunpkcs11.jar,.,c:\projects\HellowWorld\build\classes]
[loading .\helloworld\HelloWorld.class]
[loading java\lang\Object.class(java\lang:Object.class)]
[loading java\lang\Throwable.class(java\lang:Throwable.class)]
[loading java\lang\Class.class(java\lang:Class.class)]
[done in 409 ms]

Sans l' ;, c'est la fin du chemin de recherche: c:\jdk\jre\classes\c:\projects\HellowWorld\build\classes

j'ai pu aller aussi loin à cause des exemples ci-dessus.

2
répondu Jon 2012-04-02 15:48:44

Pour Windows...

DÉTAILS DU FICHIER

javaFileName: HelloWorld.java
packageCode: "package com.accessibility;"
importCode: "import com.accessibility.HelloWorld;"
javaFileLocation: "S:\Accessibility\tools\src\test\java\com\accessibility\HelloWorld.java"

la localisation javafil doit être considérée comme ayant deux parties...

classpath: "S:\Accessibility\tools\src\test\java"
relativeFilePath: "com\accessibility\HelloWorld.java"

CREATE CLASS FILE

la deuxième ligne ci-dessous a été exécutée à partir de L'invite de commande Windows.

{javacLocation} -d {ouputDirectory} {javaFileLocation}
"C:\Program Files\Java\jdk1.6.0_26\bin\javac.exe" -d "S:\Accessibility\tools\src\test\java" "S:\Accessibility\tools\src\test\java\com\accessibility\HelloWorld.java"

cela a créé le monde D'HelloWorld.fichier de classe

classFileName: HelloWorld.class 
classFileLocation: "S:\Accessibility\tools\src\test\java\com\accessibility\HelloWorld.class"

CREATE HEADER FILE

la deuxième ligne ci-dessous a été exécutée à partir de L'invite de commande Windows.

{javahLocation} -o {outputFile} -classpath {classpath} {importName}
"C:\Program Files\Java\jdk1.6.0_26\bin\javah.exe" -o "S:\Accessibility\tools\src\test\java\com\accessibility\HelloWorld.h" -classpath "S:\Accessibility\tools\src\test\java" com.accessibility.HelloWorld

ce qui a créé le HelloWorld.h fichier

classFileName: HelloWorld.h
classFileLocation: "S:\Accessibility\tools\src\test\java\com\accessibility\HelloWorld.h"
2
répondu Scott Izu 2013-08-09 21:26:34

problème sur Cygwin:

javah ne fonctionne pas correctement depuis le terminal Cygwin:

$ cd /cygdrive/c/Workspace/prj/bin
$ ls com/example/JavaHotTo.class
com/example/JavaHotTo.class
$ javah com.example.JavaHowTo
Error: Could not find class file for 'com.example.JavaHowTo'.

Mais il fonctionne parfaitement en utilisant l'option -classpath .

$ javah -classpath . com.example.JavaHowTo
$ ls *.h
com_example_JavaHotTo.h

Plus de trucs:

  • l'option -jni par défaut, il n'est donc pas besoin.
  • Vous pouvez donner relatif/absolu classpath
  • Mais javah sur MS-Windows préfère le chemin à laC:\Workspace\prj\bin
  • Utiliser cygpath -w /cygdrive/c/Workspace/prj/bin pour convertir en format MS-Windows
  • utiliser l'option -d your/jni/headers/path pour écrire les en-têtes dans un autre répertoire
  • javah crée le chemin d'accès your/jni/headers/path si elle n'existe pas (voir ci-dessous)

    $ javah -d jni/headers -classpath . com.example.JavaHowTo
    $ ls       jni\headers
    com_example_JavaHotTo.h
    $ javah -d jni\path -classpath . com.example.JavaHowTo
    $ ls       jni\path
    com_example_JavaHotTo.h
    
1
répondu olibre 2013-01-21 16:12:28

Il a travaillé avec moi:

Pour la fenêtre:

Si le chemin d'accès du fichier .classe: