JNI Problem



  • Hi Leute,

    vorweg kenn mich sehr schlecht in C++ aus - bin eher ne JAVA Userin!
    Ich versuch mich gerade an der JNI Schnittstelle von Java und habe auch schon ein HelloWorld Beispiel geschrieben das sogar funktionierte.

    Da ich eigentlich ne Java-Anbindung an MATLAB bauen wollte und dies mal direkt über die DLL probieren will bin ich auf C bzw. C++ angewiesen.

    Ich versuche mich gerade daran aus der folgenden Klasse "engine.c" eine Dll Biblitehk zu erstellen:

    #include <jni.h>
    #include "applicationserver_service_SimulinkService.h"
    #include <stdio.h>
    #include "engine.h"
    
    #define DEFAULT_BUFFERSIZE 65536
    
    Engine* ep;
    
    char outputBuffer[DEFAULT_BUFFERSIZE];
    
    JNIEXPORT void JNICALL 
    Java_applicationserver_service_SimulinkService_openEngine(JNIEnv *env, jobject obj, const jstring startcmd) {
      const char *c_string = (*env)->GetStringUTFChars(env, startcmd, 0);
      if (!(ep = engOpen(c_string))) {
        jclass exception;
        (*env)->ReleaseStringUTFChars(env, startcmd, c_string);
        exception = (*env)->FindClass(env, "java/io/IOException");
        if (exception == 0) return;
        (*env)->ThrowNew(env, exception, "Opening Matlab failed.");
        return;
      }
      (*env)->ReleaseStringUTFChars(env, startcmd, c_string);
    	/* indicate that output should not be discarded but stored in */
    	/* outputBuffer */
      engOutputBuffer(ep, outputBuffer, DEFAULT_BUFFERSIZE);
    }
    
    JNIEXPORT void JNICALL 
    Java_applicationserver_service_SimulinkService_closeEngine(JNIEnv *env, jobject obj) {
    	if (engClose(ep) == 1) {
    	  jclass exception;
        exception = (*env)->FindClass(env, "java/io/IOException");
        if (exception == 0) return;
        (*env)->ThrowNew(env, exception, "Closing Matlab failed.");
        return;
      }
    }
    
    JNIEXPORT void JNICALL
    Java_applicationserver_service_SimulinkService_evalString(JNIEnv *env, jobject obj, const jstring j_string) {
      const char *c_string;
    	c_string = (*env)->GetStringUTFChars(env, j_string, 0);
      if (engEvalString(ep, c_string) != 0) {
    	  jclass exception;
        exception = (*env)->FindClass(env, "java/io/IOException");
        if (exception == 0) return;
        (*env)->ThrowNew(env, exception, "Error while sending/receiving data.");
    	}
      (*env)->ReleaseStringUTFChars(env, j_string, c_string);
    }
    
    JNIEXPORT jstring JNICALL
    Java_applicationserver_service_SimulinkService_getOutputString(JNIEnv *env, jobject obj, jint numberOfChars) {
      char *c_string;
    	jstring j_string;
    	if (numberOfChars > DEFAULT_BUFFERSIZE) {
    		numberOfChars = DEFAULT_BUFFERSIZE;
    	}
      c_string = (char *) malloc ( sizeof(char)*(numberOfChars+1) );
    	c_string[numberOfChars] = 0;
      strncpy(c_string, outputBuffer, numberOfChars);
    	j_string = (*env)->NewStringUTF(env, c_string);
    	free(c_string);
      return j_string;
    }
    

    Ich habe alle includes und Headerdateien richtig dem Projekt hinzugefügt. Jedoch bekomme ich ne Reihe von Fehlern, die z.B wie folgt lauten:

    Fehler 1 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_engOutputBuffer" in Funktion "_Java_applicationserver_service_SimulinkService_openEngine@12". D:\Uni\Workspace\C++\EngineDLL\EngineDLL\engine.obj EngineDLL

    Fehler 2 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_engOpen" in Funktion "_Java_applicationserver_service_SimulinkService_openEngine@12". D:\Uni\Workspace\C++\EngineDLL\EngineDLL\engine.obj EngineDLL

    Fehler 3 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_engClose" in Funktion "_Java_applicationserver_service_SimulinkService_closeEngine@8". D:\Uni\Workspace\C++\EngineDLL\EngineDLL\engine.obj EngineDLL

    Fehler 4 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_engEvalString" in Funktion "_Java_applicationserver_service_SimulinkService_evalString@12". D:\Uni\Workspace\C++\EngineDLL\EngineDLL\engine.obj EngineDLL

    Fehler 5 error LNK1120: 4 nicht aufgelöste externe Verweise. D:\Uni\Workspace\C++\EngineDLL\Debug\EngineDLL.dll EngineDLL

    Kann mir jemand helfen?

    Gruß

    Steffi



  • Ich kenne mich mit JNI nich aus.

    Der Fehler "nicht aufgelöstes externes Symbol" tritt immer dann auf, wenn du die entsprechende lib nicht mitgelinkt hast. Der Header sagt nur es gibt so eine Funktion. Der eigentliche Code ist in einer Datei X.lib oder unter linux libX.a.

    Das hier hilft vielleich http://www.mathworks.com/support/solutions/en/data/1-30UM5H/index.html?product=ML&solution=1-30UM5H



  • Vielen Dank das hat geholfen!

    Mein Problem ist zur Zeit aber, dass obwohl die Kompilierung ohne Fehler durchgeführt wird (außer ein paar Intellisense Fehlern). Meine DLL nicht alle Abhängigkeiten enthält. Laut dem "depends"-Tool fehlen der DLL folgende Dll:
    icudt24l.dll
    icuin24.dll
    icuio24.dll
    icuuc24.dll
    ieshims.dll
    jvm.dll
    libmx.dll
    libut.dll
    libz.dll

    Leider Hilft in Java das manuelle hinzufügen der DLLs nicht wirklich. Kann man diese Dlls igendwie in meine engine.dll mitreinpacken oder mache ich etwas grundsätzliches falsch?!

    Gruß

    Steffi



  • Taramsis schrieb:

    Kann man diese Dlls igendwie in meine engine.dll mitreinpacken

    Das geht nicht. Du wirst dafür sorgen müssen, dass die DLLs vorhanden sind.



  • d.h. dlls einfach reinkopieren und beim kompilieren ist kein Fehler meinerseits gemacht worden!?!

    Gruß

    Steffi



  • Hi Leute,

    ich habe die obigen Probleme soweit gelöst bin jedoch der Meinung, dass bei der Kompilierung etwas schief gelaufen ist.
    Wenn ich über java die dll einlese, werden mir zwar die abgefangenen Exception Mitteilungen ausgegeben, aber meine Eingabe aus java will er einfach nicht einlesen.
    Diese zwei Java Klassen und die C klasse wurden laut meinen Recherchen schon häufig eingestzt doch leider sind die meisten adaptionen in Linux gemacht worden, so dass ich nicht deren Libary nutzen kann.
    Ich habe auf der Mathworks Seite entdeckt, dass folgende DLLs für die Kompilierung benötigt werden: libeng.dll, libmx.dll, libfile.dll

    Weiß jemand wie man in VS dll libaries einfügen kann? Oder für weitere Vorschläge bin ich dankbar!

    Gruß

    Steffi 🙂



  • Dieser Thread wurde von Moderator/in Unix-Tom aus dem Forum MFC (Visual C++) in das Forum Rund um die Programmierung verschoben.

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

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten