Swig

Der Wolf

Erfahrenes Mitglied
Hallo Freunde,

ich könnte mal wieder etwas Hilfe gebrauchen. Ich versuche mich gerade daran mit SWIG ein JNI zu bauen und experimentiere damit herum. Ich habe auch meine Testumgebung mit den cpp Source Dateien und dem entsprechenden CMakeLists.txt angehängt.
Das kompilieren klappt soweit alles, auch wenn ich es im Moment 2 mal machen muss, weil die Reihenfolge der Targets im Target ALL nicht stimmt. Falls jemand auch da einen Tipp hat immer her damit. ;)
Also die libs werden gebaut und ich kann sie auch laden, aber wenn ich in Java eine Klasse Character erzeugen will bekomme ich folgende Fehlermeldung.

Java:
Exception in thread "main" java.lang.UnsatisfiedLinkError: CharModJNI.new_Character()J
        at CharModJNI.new_Character(Native Method)
        at Character.<init>(Character.java:38)
        at Main.main(Main.java:7)
Java Result: 1

Die swig-export Methode in der _wrap.cxx Datei sieht folgendermaßen aus ...

C++:
SWIGEXPORT jlong JNICALL Java_CharModJNI_new_1Character(JNIEnv *jenv, jclass jcls) {
  jlong jresult = 0 ;
  Character *result = 0 ;
  
  (void)jenv;
  (void)jcls;
  result = (Character *)new Character();
  *(Character **)&jresult = result; 
  return jresult;
}

Und die CharMod.java hat folgenden Inhalt:

Java:
class CharModJNI {
  public final static native long new_Character();
  public final static native void delete_Character(long jarg1);
  public final static native void Character_printValues(long jarg1, Character jarg1_);
}

Schonmal vielen Dank im Vorraus

Gruß
Der Wolf
 

Anhänge

Ich habe den Großteil des Problems gelöst. Das Problem war, dass die Character_wrap.cxx nicht mit kompiliert wurde. Die fehlte in den sources die in der CMakeLists.txt angegeben wurde. Sorry, mein Fehler.

Dafür hat sich ein etwas anderes Problem aufgetan. Wie kann ich in der CMakeLists.txt dynamisch die Dateien angeben, die durch den SWIG Aufruf erzeugt werden? Da werden ja zusätzliche _wrap.cxx Dateien erzeugt, die ich aber nicht jedesmal per Hand in die CMakeLists.txt eintragen möchte.

Gruß
Der Wolf
 
Zuletzt bearbeitet:
Hi.
Dafür hat sich ein etwas anderes Problem aufgetan. Wie kann ich in der CMakeLists.txt dynamisch die Dateien angeben, die durch den SWIG Aufruf erzeugt werden? Da werden ja zusätzliche _wrap.cxx Dateien erzeugt, die ich aber nicht jedesmal per Hand in die CMakeLists.txt eintragen möchte.
Code:
file(GLOB WRAP_SRCS ${CMAKE_CURRENT_BINARY_PATH} *_wrap.cxx)
Gruß
 
Vielen Dank für den Tipp.
Es gibt auch die Möglichkeit per

Code:
AUX_SOURCE_DIRECTORY(src SOURCES)

alle source Dateien im Ordner einzubinden. Dafür müssen sie allerdings schon vorher existieren.

Gruß
Der Wolf
 
Gibt es eine einfache Möglichkeit float Arrays an eine Methode in der C/C++ Library zu übergeben, die ich mit SWIG für Java gewrapped habe? SWIG macht ja aus den Arrays SWIG_p_float Daten-Strukturen, bei denen ich bisher aber noch nicht rausgefunden habe, wie ich die mit Daten füllen kann.

Gruß
Der Wolf
 
Ich habe es mittlerweile in der Kommandozeile und mit einem Skript schonmal geschafft so ein JNI mit SWIG zusammen zu bauen. Allerdings würde ich das alles gerne über cmake und make machen lassen. CMake unterstützt ja SWIG. Aber egal wie ich es mache, bisher hat es nicht funktioniert. Ich würde gerne die benötigten SWIG definitionen per Präprozessor Direktiven in die Header Files einbauen und dann von den C++ Sourcen bis hin zu allen libs alles automatisch bauen lassen. Das bauen klappt auch so weit ohne Fehler, allerdings werden nicht die richtigen Sourcen in der JNI.so lib zusammen gefasst, was auf Java Seite zu einem UnsatisfiedLinkError führt. Für die Header File Variante habe ich bisher auch kein richtiges Tutorial gefunden, hat da vielleicht jemand eine Idee? Ich hänge mein Beispielprojekt, bestehend aus 3 C++ Klassen und einer Java-junit-Test Klasse an. Das CMakeLists.txt File ist für cmake 2.8 ausgelegt.

Vielen Dank schonmal im Vorraus
Der Wolf
 

Anhänge

Hallo und frohes neues Jahr,

ich habe mein Problem mittlerweile selbst gelöst, auch wenn es ziemlich gehackt ist. Aber wie heisst es so schön:
"Ein guter Pfusch ist noch lange kein schlechter Bau." ;)

Falls es jemanden interessiert, hier der Abschnitt in der CMakeLists.txt den ich eingefügt habe:

Code:
# ===========================================================================
# SWIG (This is hacked)
# ===========================================================================

ADD_CUSTOM_COMMAND(TARGET swigEx PRE_BUILD
											COMMAND cmake -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/src)

FIND_PACKAGE(SWIG REQUIRED)
INCLUDE(${SWIG_USE_FILE})

SET(SWIG_INTERFACES src/Character.h src/Quest.h src/GameObject.h)
SET(CMAKE_SWIG_FLAGS "-c++")

SET(CMAKE_SWIG_OUTDIR ${CMAKE_CURRENT_BINARY_DIR}/jsrc)

SET_SOURCE_FILES_PROPERTIES(${SWIG_INTERFACES} PROPERTIES CPLUSPLUS ON)

SWIG_MODULE_INITIALIZE(Tmp java)
FOREACH (header ${SWIG_INTERFACES})
	SWIG_ADD_SOURCE_TO_MODULE(Tmp swig_generated_source ${header})
	SET(swig_generated_sources ${swig_generated_sources} ${swig_generated_source})
ENDFOREACH (header)

SWIG_ADD_MODULE(swigExJNI java ${SOURCES} ${swig_generated_sources})

SWIG_LINK_LIBRARIES(swigExJNI ${JAVA_LIBRARIES} ${JNI_LIBRARIES})

Gruß
Der Wolf
 
Zurück