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.
14 réponses
javah -jni com.example.JavaHowTo
où 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
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
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...
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
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
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
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.
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"
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èsyour/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