# javah.exe Probleme!



## Tom21 (4. Mai 2008)

Hallo Leute,

habe ein kleines Problem. Beschäftige mich gerade mit JNI.
Doch leider schaffe ich es nicht javah.exe auszuführen.

Habe die Umgebungsvariable* PATH = C:\Programme\Java\jdk1.6.0_03\bin* gesetzt. Wenn ich dann in das Verzeichnis c:\Projekt\scr reingehe wo die HelloWorld.class liegt und folgendes ausführe:

*javah -jni HelloWorld.class*

kommt die Fehlermeldung

*cannot access HelloWorld.class
classfile for HelloWorld.class not found
javadoc: error - Class HelloWorld.class not found
error: No classes were specified on the command line*

Habe etwas von einer CLASSPATH gelesen. Doch was muss ich in dieser Variable setzten??

Hoffe jemand kann mir helfen.


----------



## thE_29 (4. Mai 2008)

Wie wärs mit
javah -jni HelloWorld

class wird nie angegeben


----------



## Guest (4. Mai 2008)

Mach mal javah ohne das .class hinter dem Klassennamen
	
	
	
	





```
javah -jni HelloWorld
```
Spätestens diese Fehlermeldung "class file for HelloWorld.class not found" sollte dir ein Hinweis darauf sein, 
dass javah die Klasse und nicht die Klassendatei erwartet. 
Die Kommandozeilenhilfe sagt ebenfalls "Usage: javah [options] <*classes*>" und nicht class-files.


----------



## tom21 (4. Mai 2008)

hallo,

habe es so ausgeführt wie ihr es gesagt habt. Jetzt kommt folgende Fehlermeldung

*error: Cannot access HelloWorld
bad class file: .\HelloWorld.class
class file contains wrong class: test.HelloWorld
Please remove or make sure it appears in the correct subdirectory of the classpath.*

*com.sun.tools.javac.util.Abort
       at com.sun.tools.javac.comp.Check.completitionError(Check.java:164)
       ...*



Wenn meine Klasse einen Fehler hätte, dann würde sie doch nicht kompaliert werden oder??


----------



## semi (4. Mai 2008)

OK, der Reihe nach.
Ich gehe davon aus, dass deine Klasse HelloWorld ungefähr so aussieht

```
package test;

public class HelloWorld
{
   public static native void foo();

   ...
}
```
1) Erstelle die folgende Verzeichnisstruktur
	
	
	
	





```
c:\projekte
   |-- hello
       |-- build
       |   |-- classes
       |   |-- includes
       |
       |-- src
           |-- test
               |-- HelloWorld.java
```
2) Wechsle in das Verzeichnis "c:\projekte\hello" und compiliere die Klasse HelloWorld
	
	
	
	





```
javac -d build\classes src\test\HelloWorld.java
```
3) dann noch die Header-Datei generieren lassen
	
	
	
	





```
javah -d build\includes -classpath build\classes test.HelloWorld
```

Wenn deine Klassen irgendwelche Package-Deklarationen haben, musst du diese mit dem -d Parameter compilieren
und das Zielverzeichnis angeben. Das ist das Ausgabeverzeichnis, in das die compilierten Klassen geschrieben werden
sollen (im obigen Beispiel ist es das Verzeichnis build\classes)
javah braucht dieses Verzeichnis wieder in Classpath, um die Klasse zu finden. Mit -d in javah sagst du, wohin mit 
der/den generierten Header-Datei(en) und die Klasse(n) musst du mit kompletten Package angeben (hier test.HelloWorld).


----------



## Tom21 (4. Mai 2008)

hallo semi,

Unglaublich . . . Es funktioniert so wie du es gesagt hast... Jetzt muss ich mal erforschen warum überhaupt ;-)

danke für eure Hilfe


----------



## Tom21 (4. Mai 2008)

Hast du dir die Verzeichnisstruktur selber ausgedacht?

Denn in Eclipse erstellt er mir eine andere Verzeichnisstruktur... ohne ein includes Verzeichnis. Nur aus Interesse

gruss


----------



## semi (4. Mai 2008)

Ehmm... ja. Ich dachte, du verwendest keine IDE, daher der Vorschlag mit den Verzeichnissen. 
Du kannst dir die Verzeichnisse so organisieren, wie es dir gerade passt oder das ganze Eclipse 
überlassen.  Eclipse macht bei dir sicherlich ein bin-Verzeichnis und darunter die compilierten 
Dateien (Default bei Eclipse).
In diesem Fall kannst du javah z.B. wie folgt aufrufen
	
	
	
	





```
javah -classpath .\bin; test.HelloWelt
```
Das Ergebnis ist dann im aktuellen Verzeichnis.


----------



## Tom21 (5. Mai 2008)

ahhh ok. 

Dann noch eine Frage . . .

Wo würdest du die ganzen .dlls und unds C Programme ablegen in deiner Verzeichnisstruktur die du oben definiert hast. 
Ist gerade meine erste Erfahrng mit JNI, und wäre gut wenn ich lerne wie ich zukünftig meine Dateien organisieren kann.

Und noch eine letzte Frage . . .

ich habe eine .lib Datei und einige dlls zur Verfügung gestellt. Was steckt in eine .lib Datei, wozu ist sie da???




Hoffe ich belästige dich nicht mit meine Fragen ;-) 

guss Tom


----------



## Guest (5. Mai 2008)

Die lib-Dateien wirst du nicht brauchen. Das ist ein Zwischenprodukt der Compilierung deiner C-Quellen
und wurde durch den Linker in die DLL übernommen.
Verpacke dein Programm am besten in eine Jar-Datei. Die DLLs kannst du im gleichen Verzeichnis lassen, 
wo dein Programm (die Jar-Datei) liegt. Bei JNI wird nämlich zuerst im aktuellen Verzeichnis nach der DLL
gesucht. Solltest du ein andere Verzeichnis wählen, musst du dies bei der Ausführung angeben.
z.B. (DLLs im Unterverzeichnis bin)
java -Djava.library.path=./bin -jar meinprogramm.jar

Gruß,
semi


----------

