Probleme mit JNI



  • Hi,
    da ich in Java son paar Sachen nicht machen kann brauche ich da jetzt wohl die Hilfe von C++ 🙂

    Daher habe ich mich mal an JNI versucht. Ich habe die Java-Class erstellt und daraus die Headerdatei gemacht und die in meine Cpp-Datei eingebunden. Habe erstmal ein ganz simples Beispiel genommen wo nur die Länge eines Strings zurückgegeben wird. Beim compilieren der Cpp-Datei bekomme ich aber den Fehler:
    fatal error C1010: Unerwartetes Dateiende während der Suche nach der Direktive für die vorkompilierte Headerdatei

    Was kann da der Fehler sein?

    Java:

    import java.awt.*;
    import java.awt.event.*;
    
    class java extends Frame implements ActionListener
    {
    	TextField tf;
    	Label l1, l2;
    
    	// declaration of native method
    	private native int process(String string);
    
    	java()
    	{
    		l1 = new Label("Eingabe:");
    		l2 = new Label();
    		tf = new TextField(20);
    		add(l1);
    		add(tf);
    		add(l2);
    		tf.addActionListener(this);
    	}
    
    	public void actionPerformed(ActionEvent e)
    	{
    		l2.setText("Gelesen: " + process(tf.getText()) + " Zeichen");
    		tf.setText("");
    	}
    	// load native library
    	static
    	{
    		System.loadLibrary("MyLib");
    	}
    
    	public static void main(String args[])
    	{
    		new java();
    	}
    
    }
    
    #include <iostream.h>
    #include <string.h>
    #include <jni.h>
    #include "java.h"
    
    using namespace std;
    
    JNIEXPORT jint JNICALL Java_MyFrame_process(JNIEnv* env, jobject obj, jstring string)
    {
    	// get Java String
    	jboolean isCopy;
    	const char* str =
    	env->GetStringUTFChars(string, &isCopy);
    	int len = strlen(str);
    	cout << endl << str << endl;
    	cout << "Processed: " << len
    	<< " characters" << endl;
    	if( isCopy == JNI_TRUE )
    	env->ReleaseStringUTFChars(string, str);
    	return (jint)len;
    }
    


  • Baweg schrieb:

    fatal error C1010: Unerwartetes Dateiende während der Suche nach der Direktive für die vorkompilierte Headerdatei

    Entweder du stellst die Verwendung von vorcompilierten Headern aus (geht irgendwo in den Compiler-Optionen), dann sucht er diese Direktive nicht mehr. Oder du setzt am Anfang deines Quelltextes ein '#include "stdafx.h"', damit die Suche erfolgreich verläuft.

    (wenn im zweiten Fall ein "Datei nicht gefunden" erscheint, legst du eine leere Datei namens "stdafx.h" ins Hauptverzeichnis)



  • Wenn ich das vor die anderen includes schreibe dann kommt
    fatal error C1083: Include-Datei kann nicht geöffnet werden: 'iostream.h': No such file or directory

    Und wenn ich hinter die anderen schreibe dann sagt er:

    error C2059: Syntaxfehler: ')'
    error C2065: 'env': nichtdeklarierter Bezeichner
    error C2065: 'JNIEnv': nichtdeklarierter Bezeichner
    error C2065: 'jobject': nichtdeklarierter Bezeichner
    error C2078: Zu viele Initialisierungen
    error C2143: Syntaxfehler: Es fehlt ';' vor '{'
    error C2146: Syntaxfehler: Fehlendes ')' vor Bezeichner 'obj'
    error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'Java_MyFrame_process'
    error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'jint'
    error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'JNICALL'
    error C2447: '{': Funktionskopf fehlt - Parameterliste im alten Stil?
    error C2501: 'Java_MyFrame_process': Fehlende Speicherklasse oder Typspezifizierer
    error C2501: 'jint': Fehlende Speicherklasse oder Typspezifizierer
    error C2501: 'JNICALL': Fehlende Speicherklasse oder Typspezifizierer
    error C2501: 'JNIEXPORT': Fehlende Speicherklasse oder Typspezifizierer



  • Baweg schrieb:

    Wenn ich das vor die anderen includes schreibe dann kommt
    fatal error C1083: Include-Datei kann nicht geöffnet werden: 'iostream.h': No such file or directory

    Der Header heißt ja auch nicht <iostream.h>, sondern <iostream> (und <string.h> kannst du gleich ersetzen durch <cstring>).



  • Ah stimmt...hab das so im inet gefunden...

    Und was ist mit jni.h!? Die findet der auch net... auch nicht ohne h!



  • Das ist kein ANSI-Header, also ist <jni.h> eigentlich richtig. Aber dazu mußt du deinem Compiler mitteilen, wo er diese Datei finden soll (am besten, indem du sie in seinen Default-Include-Header kopierst).



  • Wo finde ich denn die Headerdatei!? Und wie kopier ich die in den Default-Include-Header?



  • Die findest du im include-Verzeichnis deiner JDK-Installation.

    Aber Vorsicht: jni.h includiert seinerseits eine Datei namens jni_md.h
    Die mußt du auch mitkopieren.

    Wohin die bei dir kopiert werden müßen hangt von deiner
    C++ Entwicklungsumgebung ab.

    Ich bin seit gestern auch dabei JNI zu nutzen, allerdings brauche
    ich kein C++; C reicht für meine Zwecke vollkommen aus und mit
    Dev-CPP ist es auch recht einfach zu nutzen.



  • Ich benutze Visual Studio .NET 2003
    Weiß jemand wo ich das da hinkopieren muss?
    Und wie kann cih eine dll erstelle? Überall steht auf Neu => Projekt => Dynamic-Link-Library aber das gibt es nicht! Gibt nur MFC-DLLs aber das will ich ja nicht!



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum MFC (Visual C++) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Einfach "Vorkompilierte Headerdateien verwenden" deaktivieren.
    jni.h liegt irgendwo im JDK Verzeichnisbaum, ebenso die Libs.
    Daher mußt du die entsprechenden Pfade in deinem Projekt hinzufügen.
    DLLs erzeugst du mit einem DLL Projekt



  • Und wie kann ich die Pfade in Visual Studio angeben? Ich hab die jni.h einfach mal als Element ins Projekt geladen aber dann kommt die Meldung immernoch...



  • Ich bin nun wahrlich kein Experte für IDE's für C++.

    Aber wenn du schreibst, du hättest jni.h (vergiß daß jni_md.h)
    mit in dein Projekt genommen, vermute ich mal, daß du in diesem
    Fall nicht

    #include <jni.h>
    

    sondern

    #include "jni.h"
    

    schreiben mußt.

    Falls dem so ist, mußt du natürlich auch das #include <jni_md.h> in
    jni.h entsprechend ändern.



  • Habs mit <jni.h> und "jni.h" versucht.
    In der jni.h is nochmal ein #include <jni.h> und das hat ich auch mal geändert in "jni.h". Immernoch die Meldung dass ers nicht findet...



  • Baweg schrieb:

    In der jni.h is nochmal ein #include <jni.h>

    Das kann ich mir jetzt weniger vorstellen; es wäre ja ein unendliches
    Inkludieren. Oder die Zeile wird über ifdefs gar nicht erreicht.

    Was aber dort stehen sollte (Java 1.5's jni.h zumindest) ist,

    #include <jndi_mh.h>

    Ansonsten kann ich dir auch nicht weiterhelfen. 😞


Log in to reply