Commander:
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 correctement défini le chemin d'accès aux classes, mais j'obtiens toujours cette erreur javah
.
Toute solution pour cela sera très utile.
Essayer
javah -jni com.example.JavaHowTo
où com.example
est votre colis.
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
Les éléments suivants ont fonctionné 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
L'option -jni n'est pas requise (définie par défaut)
Quoi qu'il en soit, vous devriez vérifier que votre fichier de classe a été généré: assez surpris que vous obteniez également une erreur javadoc ...
J'ai rencontré la même erreur et en utilisant http://www.inonit.com/cygwin/jni/helloWorld/header.html lien, j'ai réussi à générer le fichier .h. 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 example.jni est mon nom de package et C:\Prachi\Android\Workspace_QP_re structure\
est l'endroit où se trouve le chemin de mon espace de travail Eclipse.
J'espère que cela vous aide
J'ai eu ce problème lorsque j'ai ajouté au répertoire -classpath mon répertoire source. Je pensais que les classes étaient dans des fichiers * .Java;)
Javah travaille sur le code d'octet, vous devez donc ajouter un répertoire avec vos binaires à classpath
J'ai fait une tâche Eclipse:
"Emplacement"
${env_var:Java_HOME}\bin\javah.exe
"Arguments"
-verbose
-force
-classpath ;${project_loc}\bin
-d ${project_loc}\jni
${Java_type_name}
Sélectionnez le fichier et exécutez
J'utilise Eclipse.
Syntaxe de commande:
javah -d <outputdir> -classpath <classpath> <fully_qualified_class>
outputdir
- Le répertoire où le fichier d'en-tête est généré.
classpath
- Contient un chemin absolu vers le répertoire contenant le paquet racine.
fully_qualified_class
- Le nom de la classe contenant les méthodes natives SANS .class
extension
Le fichier suivant est généré:
C:\Users\John\workspace\JNITest\bin\com\canessa\john\jnitest\com_canessa_john_jnitest_CallMyCLib.h
Le contenu du fichier d'en-tête généré:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_canessa_john_jnitest_CallMyCLib */
#ifndef _Included_com_canessa_john_jnitest_CallMyCLib
#define _Included_com_canessa_john_jnitest_CallMyCLib
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_canessa_john_jnitest_CallMyCLib
* Method: helloInC
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_canessa_john_jnitest_CallMyCLib_helloInC
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
Dans mon cas, le problème était assez stupide .. J'essaie: javah com.aaa.bbb.ClassName . class
sans ".class" je génère correctement le fichier .h
javah com.aaa.bbb.ClassName
Pour les fenêtres...
javaFileName: HelloWorld.Java
packageCode: "package com.accessibility;"
importCode: "import com.accessibility.HelloWorld;"
javaFileLocation: "S:\Accessibility\tools\src\test\Java\com\accessibility\HelloWorld.Java"
Le javaFileLocation doit être considéré comme ayant deux parties ...
classpath: "S:\Accessibility\tools\src\test\Java"
relativeFilePath: "com\accessibility\HelloWorld.Java"
La deuxième ligne ci-dessous a été exécutée à partir de l'invite de commandes 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 fichier HelloWorld.class
classFileName: HelloWorld.class
classFileLocation: "S:\Accessibility\tools\src\test\Java\com\accessibility\HelloWorld.class"
La deuxième ligne ci-dessous a été exécutée à partir de l'invite de commandes 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
Cela a créé le fichier HelloWorld.h
classFileName: HelloWorld.h
classFileLocation: "S:\Accessibility\tools\src\test\Java\com\accessibility\HelloWorld.h"
J'ai eu des problèmes similaires et j'ai 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 le;, c'est la fin du chemin de recherche: c:\jdk\jre\classes\c:\projects\HellowWorld\build\classes
J'ai pu aller aussi loin grâce aux exemples ci-dessus.
Cela a fonctionné avec moi:
Pour la fenêtre:
Si le fichier de chemin .class: D:\workspace\JNI Demo\build\classes\jni\demo et dans le package hava Netbeans: jni.demo.HelloWorld.Java
Tout d'abord, je buijd fichier .Java dans le fichier .class.
Fichier de chemin .class: D:\workspace\JNI Demo\build\classes\jni\demo\HelloWorld.class
Deuxièmement, je dir D:\workspace\JNI Demo\build\classes
Et javah -jni jni.demo.HelloWorld
Enfin, résultat du fichier .j créé dans le chemin: D:\workspace\JNI Demo\build\classes
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 cela fonctionne parfaitement en utilisant l'option -classpath .
$ javah -classpath . com.example.JavaHowTo
$ ls *.h
com_example_JavaHotTo.h
Plus d'astuces:
-jni
est par défaut, il n'est donc pas requis.classpath
javah
sur MS-Windows préfère le chemin à laC:\Workspace\prj\bin
cygpath -w /cygdrive/c/Workspace/prj/bin
pour convertir au format MS-Windows-d your/jni/headers/path
pour écrire des en-têtes dans un autre répertoirejavah
crée le chemin your/jni/headers/path
s'il 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
Accédez à votre répertoire "bin" de votre projet Java via la ligne de commande cmd Windows.
cd "Path to the bin directory of your Java project"
Alors,
javah "Your Package"."Name Of Your Java Class"
La suite a fonctionné pour moi ... Allez sur le chemin du projet depuis le terminal comme,
/ home/usr/Desktop/Workspace/ProjectName/src/main/Java
et appuyez sur la commande suivante,
javah -jni com.abc.test.callfileName (Sans extension .class)
le fichier com_abc_test_className.h sera créé dans le chemin suivant / home/usr/Desktop/Workspace/ProjectName/src/main/Java
enfin la commande ressemble à [ma-machine/usr] $/home/usr/Desktop/Workspace/ProjectName/src/main/Java/src/main/Java> javah -jni com.abc.test. className
Comment générer un fichier `JNI Header` à partir d'un fichier` Android class` en utilisant `javah` (` .Java` ou `.class` LES DEUX fonctionnent aussi bien).
Pour le projet Eclipse sous Windows:
Aller au répertoire où se trouvent les dossiers src, bin et jni (afin que nous puissions utiliser des chemins relatifs vers src ou bin et jni): Cd C:\Android\workspace5\AndroidImageFilter Je suppose que `javah` est dans votre` PATH` (Il est dans quelque chose comme: `C:\Program Files\Java\jdk1.7.0_79\bin\javah.exe`) : javah -classpath c:\Android\sdk\plates-formes\Android-19\Android.jar; ./ src/-d ./jni cn.Ragnarok.NativeFilterFunc ^ ^ ^ ^ ^ ^ ^ ^ ^ | | | | | | | | | Votre Android: targetSdkVersion = "16" ---------------------------- + | | | | | | | | | | | | | | | | | | | | | | | chemin vers Android.jar --------- + ----------------------------- ---------- + | | | | | | | | | | | | | | | | | | | | | | | | point-virgule (;) important! -------------------------------------------------- + | | | | | | | | | | Vous pouvez utiliser le répertoire source (oui vous pouvez!) (OU le répertoire/bin/classes/dir) ----- + | | | | | | | | Où placer le fichier de sortie (cn_Ragnarok_NativeFilterFunc.h dans ce cas) ----------- + --- + | | | | Le chemin d'accès complet du nom du package pointé (.) Au fichier source .Java AVEC le nom de fichier -------- + | | Nom de fichier d'un Java --------------------------------------- ---------------------------------------------- + Pour Android Studio sous Windows e'g ': ^ Cd C:\Android\workspace5\AndroidImageFilter\app\src\main | et usr Java INSTEAD of src -------------------------------- -------------------- +
Voir http://kn-gloryo.github.io/Build_NDK_AndroidStudio_detail/ pour une meilleure façon.
Si vous avez beaucoup de noms de fichiers (de Java), vous pouvez utiliser un fichier avec une liste de classes.
Si vous êtes sous Linux ou MAC-OS, utilisez ":" (deux points) pour séparer les répertoires du chemin de classe plutôt que ";"
Voir référence http://docs.Oracle.com/javase/1.5.0/docs/tooldocs/windows/javah.html