web-dev-qa-db-fra.com

Erreur Javah lors de son utilisation dans JNI

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.

43
krishnakumar

Essayer

javah -jni com.example.JavaHowTo

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
81
Glen

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

13
jankos

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 ...

11
dilig0

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

9

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

4
Konrad Nowicki

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
3
user5948557

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

3
Marco McRoni

Pour les fenêtres...

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"

Le javaFileLocation doit être considéré comme ayant deux parties ...

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

CRÉER UN FICHIER DE CLASSE

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"

CRÉER UN FICHIER D'EN-TÊTE

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"
2
Scott Izu

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.

2
Jon

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

1
Hoang Thai

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 cela fonctionne parfaitement en utilisant l'option -classpath .

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

Plus d'astuces:

  • L'option -jni est par défaut, il n'est donc pas requis.
  • Vous pouvez donner un relatif/absolu classpath
  • Mais javah sur MS-Windows préfère le chemin à laC:\Workspace\prj\bin
  • Utilisation cygpath -w /cygdrive/c/Workspace/prj/bin pour convertir au format MS-Windows
  • Utilisez l'option -d your/jni/headers/path pour écrire des en-têtes dans un autre répertoire
  • javah 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
    
1
olibre

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"
0
Max Dy

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

0
Sarang.C
 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

0
Jon Goodwin