Errore Javah durante l’utilizzo in JNI

Comando:

javah -jni JavaHowTo 

Risultato:

 error: cannot access JavaHowTo class file for JavaHowTo not found javadoc: error - Class JavaHowTo not found. Error: No classs were specified on the command line. Try -help. 

Ho impostato correttamente il percorso della class, ma sto ancora ricevendo questo errore javah .

Qualsiasi soluzione per questo sarà molto utile.

Provare

 javah -jni com.example.JavaHowTo 

dove com.example è il tuo pacchetto.

È inoltre necessario eseguire javah dalla directory contenente com/example/JavaHowTo.class

per esempio se la tua struttura è

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

eseguire javah da

 /home/user 

Quanto segue ha funzionato per me (Win7):

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

Eseguo questo dalla directory principale dell’app.

Il problema era nelle classi sotto-directory

Uso correttamente javah ogni giorno dai miei script di compilazione con le seguenti opzioni:

javah -d -classpath

dove:

'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’opzione -jni non è richiesta (impostata di default)

Ad ogni modo dovresti controllare che il tuo file di class sia stato generato: piuttosto sorpreso che tu abbia anche un errore javadoc …

Ho riscontrato lo stesso errore e utilizzando il link http://www.inonit.com/cygwin/jni/helloWorld/header.html sono riuscito a generare correttamente il file .h. Ho usato il seguente comando

 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 

qui example.jni è il nome del mio pacchetto e C:\Prachi\Android\Workspace_QP_re structure\ è il percorso del mio spazio di lavoro eclipse.

Spero che questo ti aiuti

Ho avuto questo problema quando aggiungo a -classpath la mia directory di origine . Pensavo che le classi fossero nei file * .java;)

Javah sta lavorando su codice byte, quindi devi aggiungere la directory con i tuoi binari a classpath

Ho fatto qualche operazione di eclipse:

“Posizione”

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

“Argomenti”

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

Seleziona il file ed Esegui

Nel mio caso il problema è stato piuttosto stupido .. Ci provo: javah com.aaa.bbb.ClassName. class

senza “.class” Genero correttamente il file .h.

javah com.aaa.bbb.ClassName

Ho avuto problemi simili e ho usato l’opzione -verbose. Ho dovuto aggiungere un; nella parte anteriore dell’opzione classpath.

 C:\Projects\HelloWorld\src>javah -verbose -classpath c:\projects\HellowWorld\build\classs 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\classs\c:\projects\HellowWorld\build\classs ] Error: No classs were specified on the command line. Try -help. C:\Projects\HelloWorld\src>javah -verbose -classpath ;c:\projects\HellowWorld\build\classs 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\classs\;c:\projects\HellowWorld\build\classs ] [Creating file helloworld_HelloWorld.h] [search path for source files: .,c:\projects\HellowWorld\build\classs] [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\classs,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\classs] [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] 

Senza il;, questa è la fine del percorso di ricerca: c: \ jdk \ jre \ classs \ c: \ projects \ HellowWorld \ build \ classs

Sono stato in grado di arrivare così lontano a causa degli esempi sopra.

Per Windows …

DETTAGLI DEL FILE

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

La javaFileLocation dovrebbe essere vista come se avesse due parti …

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

CREA UN FILE DI CLASSE

La seconda riga di seguito è stata eseguita dal prompt dei comandi di 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" 

Questo ha creato il file HelloWorld.class

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

CREA IL FILE DELL’INTESTAZIONE

La seconda riga di seguito è stata eseguita dal prompt dei comandi di 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 

Questo ha creato il file HelloWorld.h

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

problema su Cygwin:

javah non funziona correttamente dal terminale 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'. 

Ma funziona perfettamente usando l’opzione -classpath .

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

Altri trucchi:

  • L’opzione -jni è di default, quindi non è richiesta.
  • È ansible assegnare un classpath relativo / assoluto
  • Ma javah su MS-Windows preferisce il percorso à la C:\Workspace\prj\bin
  • Utilizzare cygpath -w /cygdrive/c/Workspace/prj/bin per convertire in formato MS-Windows
  • Usa l’opzione -d your/jni/headers/path per scrivere le intestazioni in un’altra directory
  • javah crea il percorso your/jni/headers/path se non esiste (vedi sotto)

     $ 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 

Ha funzionato con me:
Per finestra:
Se il percorso file .class: D: \ workspace \ JNI Demo \ build \ classs \ jni \ demo e nel pacchetto hava Netbeans: jni.demo.HelloWorld.java
Per prima cosa, ho aggiunto il file .java nel file .class.
Path file .class: D: \ workspace \ JNI Demo \ build \ classs \ jni \ demo \ HelloWorld.class
In secondo luogo, dirò D: \ workspace \ JNI Demo \ build \ classs
E javah -jni jni.demo.HelloWorld
Infine, File risultato .j creato nel percorso: D: \ workspace \ JNI Demo \ build \ classs

Sto usando Eclipse.

Sintassi del comando:

 javah -d  -classpath   

outputdir – La directory in cui viene generato il file di intestazione.

classpath – Contiene un percorso assoluto alla directory contenente il pacchetto radice.

fully_qualified_class – Il nome della class che contiene i metodi nativi SENZA estensione .class

Viene generato il seguente file:

C: \ Users \ John \ workspace \ JNITest \ bin \ com \ Canessa \ john \ jnitest \ com_canessa_john_jnitest_CallMyCLib.h

Il contenuto del file di intestazione generato:

 /* DO NOT EDIT THIS FILE - it is machine generated */ #include  /* 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 

Vai alla tua directory “bin” del tuo progetto Java attraverso la riga di comando di cmd Windows.

 cd "Path to the bin directory of your java project" 

Poi,

 javah "Your Package"."Name Of Your Java Class" 

In seguito ha funzionato per me … Vai al percorso del progetto da terminale come,

/ home / usr / Desktop / Workspace / ProjectName / src / main / java

e premi il seguente comando,

javah -jni com.abc.test.callfileName (senza estensione .class)

Il file com_abc_test_className.h verrà creato nel seguente percorso / home / usr / Desktop / Workspace / ProjectName / src / main / java

infine il comando sembra, [my-machine / usr] $ / home / usr / Desktop / Workspace / ProjectName / src / main / java / src / main / java> javah -jni com.abc.test.className

 Come generare un file `JNI Header` da un file` class Android` usando `javah` (` .java` o `.class` BOTH funzionano ugualmente bene). 
Per il progetto Eclipse su Windows:
Vai alla directory in cui si trovano le cartelle src, bin e jni (così possiamo usare i percorsi relativi a src o bin e jni): cd C: \ Android \ workspace5 \ AndroidImageFilter Presumo `javah` è nel tuo` PATH` (è in qualcosa di simile: `C: \ Programmi \ Java \ jdk1.7.0_79 \ bin \ javah.exe`): javah -classpath c: \ Android \ sdk \ piattaforms \ android-19 \ android.jar; ./ src / -d ./jni cn.Ragnarok.NativeFilterFunc ^ ^ ^ ^ ^ ^ ^ ^ ^ | | | | | | | | | Il tuo android: targetSdkVersion = "16" ---------------------------- + | | | | | | | | | | | | | | | | | | | | | | | percorso per android.jar --------- + ----------------------------------- ---- + | | | | | | | | | | | | | | | | | | | | | | | | punto e virgola (;) importante! -------------------------------------------------- + | | | | | | | | | | Puoi usare la directory dei sorgenti (sì puoi!) (OPPURE il / bin / classs / dir) ----- + | | | | | | | | Dove mettere il file di output (cn_Ragnarok_NativeFilterFunc.h in questo caso) ----------- + --- + | | | | Il punto (.) Ha spearato il percorso completo del nome del pacchetto nel file di origine .java WITH nome file -------- + | | Nome del file di una class java -------------------------------------------- ----------------------------------------- + Per Android Studio su Windows e'g ': ^ cd C: \ Android \ workspace5 \ AndroidImageFilter \ app \ src \ main | e usr java INSTEAD di src -------------------------------------------- -------- +

Vedi http://kn-gloryo.github.io/Build_NDK_AndroidStudio_detail/ per un modo migliore.

Se hai molti nomi di file (di classi java) puoi usare un file con un elenco di classi.
Se sei su Linux o MAC-OS, usa “:” (due punti) per separare le directory per classpath piuttosto che “;”
Vedi riferimento http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/javah.html