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.dllLeider 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.dllWeiß 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.