# swig



## nameac (5. Dez 2006)

hallo,

swig ist ein tool um java mit c/c++ zu verbinden und als zip archiv downloadbar. diesem zip archiv liegen beispiel projekte bei die in vs 6.0 erstellt wurden. die beispiele habe ich mit vs 2005 geöffnet und compiliert. erhalte allerdings folgende fehlermeldung:

```
------ Neues Erstellen gestartet: Projekt: example, Konfiguration: Debug Win32 ------
Die Zwischen- und Ausgabedateien für das Projekt "example" mit der Konfiguration "Debug|Win32" werden gelöscht.
Ein benutzerdefinierter Buildschritt wird ausgeführt.
In order to function correctly, please ensure the following environment variables are correctly set:
JAVA_INCLUDE: 
JAVA_BIN: 
e:\c_progs\simple>..\..\..\swig.exe -java e:\c_progs\simple\example.i 
Der Befehl "..\..\..\swig.exe" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
e:\c_progs\simple>if errorlevel 1 goto VCReportError 
e:\c_progs\simple>echo Project : error PRJ0019: Ein Tool hat einen Fehlercode aus folgender Quelle zurückgegeben: "Ein benutzerdefinierter Buildschritt wird ausgeführt." 
Project : error PRJ0019: Ein Tool hat einen Fehlercode aus folgender Quelle zurückgegeben: "Ein benutzerdefinierter Buildschritt wird ausgeführt."
e:\c_progs\simple>exit 1 
Projekt : warning PRJ0018 : Folgende Umgebungsvariablen konnten nicht gefunden werden:
$(JAVA_INCLUDE)
Das Buildprotokoll wurde unter "file://e:\c_progs\simple\Debug\BuildLog.htm" gespeichert.
example - 2 Fehler, 0 Warnung(en)
========== Alles neu erstellen: 0 erfolgreich, Fehler bei 1, 0 übersprungen ==========
```
kann mir jemand sagen wie man die umgebungs variablen im project richtig setzt und wie man den pfad auf swig ändern kann?


----------



## Gast (5. Dez 2006)

hast du denn swig.exe im path drin?


----------



## WieselAc (5. Dez 2006)

Lies dir mal in der swig manual den Teil mit der "installation" unter windows durch. Du musst da nen ganzen packen PATH variablen definieren, dann klappts!!


----------



## nameac (5. Dez 2006)

ich habe jetz unter System -> umgebungsvariablen-> systemvariablen

zu der path variablen D:\Programme\swigwin-1.3.29\. hinzugefügt
und die variablen 
JAVA_INCLUDE 
d:\programme\java\jdk1.6.0\include

JAVA_BIN
d:\programme\java\jdk1.6.0\bin

erzeugt und neugestartet

die fehlermeldung sieht jetz so aus
*
------ Neues Erstellen gestartet: Projekt: example, Konfiguration: Debug Win32 ------
Die Zwischen- und Ausgabedateien für das Projekt "example" mit der Konfiguration "Debug|Win32" werden gelöscht.
Ein benutzerdefinierter Buildschritt wird ausgeführt.
In order to function correctly, please ensure the following environment variables are correctly set:
JAVA_INCLUDE: d:\programme\java\jdk1.6.0\include
JAVA_BIN: d:\programme\java\jdk1.6.0\bin
e:\c_progs\simple>..\..\..\swig.exe -java e:\c_progs\simple\example.i 
Der Befehl "..\..\..\swig.exe" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
e:\c_progs\simple>if errorlevel 1 goto VCReportError 
e:\c_progs\simple>echo Project : error PRJ0019: Ein Tool hat einen Fehlercode aus folgender Quelle zurückgegeben: "Ein benutzerdefinierter Buildschritt wird ausgeführt." 
Project : error PRJ0019: Ein Tool hat einen Fehlercode aus folgender Quelle zurückgegeben:   "Ein benutzerdefinierter Buildschritt wird ausgeführt."
e:\c_progs\simple>exit 1 
Das Buildprotokoll wurde unter "file://e:\c_progs\simple\Debug\BuildLog.htm" gespeichert.
example - 2 Fehler, 0 Warnung(en)
========== Alles neu erstellen: 0 erfolgreich, Fehler bei 1, 0 übersprungen ==========
*


----------



## WieselAc (5. Dez 2006)

Hmm also hab mir gerade auch nochmal das zip file frisch gezogen. und entpackt. Wenn ich jetzt unter \swigwin-1.3.30\Examples\java\simple die projektdatei example.dsp öffne (VS 6.0) klappt alles?!


----------



## nameac (5. Dez 2006)

ich benutze vs 2005 dann probier ichs ma mit 6.0 hast du auch nur die 3 pfade setzen müssen oder garnichts weiter gemacht als geöffnet und compiliert?


----------



## WieselAc (5. Dez 2006)

Genau, wobei die pfade hatte ich schon gesetzt. Ich hab da schonmal was mit machen "dürfen"


--------------------------------------------------------------------------------------

Temporäre Dateien und Ausgabedateien für "example - Win32 Release" werden gelöscht.
--------------------Konfiguration: example - Win32 Release--------------------
Benutzerdefinierte Build-Stufe wird für .\example.i ausgeführt
In order to function correctly, please ensure the following environment variables are correctly set:
JAVA_INCLUDE: C:\Entwicklung\JDK\j2sdk1.4.2_06\include
JAVA_BIN: C:\Entwicklung\JDK\j2sdk1.4.2_06\bin
C:\scan\swigwin-1.3.30\Examples\java\simple>..\..\..\swig.exe -java .\example.i 
Kompilierung läuft...
example.c
example_wrap.c
Linker-Vorgang läuft...
   Bibliothek Release/example.lib und Objekt Release/example.exp wird erstellt
Java compile post-build step
C:\scan\swigwin-1.3.30\Examples\java\simple>"C:\Entwicklung\JDK\j2sdk1.4.2_06\bin\javac" *.java 

example.dll - 0 Fehler, 0 Warnung(en)

--------------------------------------------------------------------------------------


----------



## nameac (5. Dez 2006)

weißt du wo man in dem projekt einstellt das der automatisch das programm swig aufruft?


----------



## WieselAc (5. Dez 2006)

Das machst du unter "Projekteinstellungen" und dann auf i-Datei (z.B.: example.i). 

Dort trägst du dann unter "Benutzdefiniertes Erstellen" den Aufruf ein.

-----------------------------------------------------

echo In order to function correctly, please ensure the following environment variables are correctly set: 
echo JAVA_INCLUDE: %JAVA_INCLUDE% 
echo JAVA_BIN: %JAVA_BIN% 
echo on 
..\..\..\swig.exe -java $(InputPath)


----------



## nameac (5. Dez 2006)

a cool danke jetz funzts


----------



## nameac (5. Dez 2006)

ich versuch grad zufuss so ein projekt nachzubauen welche funktion hat denn das makefile in dem simple projekt

```
TOP        = ../..
SWIG       = $(TOP)/../preinst-swig
SRCS       = example.c
TARGET     = example
INTERFACE  = example.i
SWIGOPT    =

all::	java

java::
	$(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
	SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' java
	javac *.java

clean::
	$(MAKE) -f $(TOP)/Makefile java_clean

check: all
```
kannst du mir erklären was die einzelnen befehlszeilen bedeuten?


----------



## WieselAc (5. Dez 2006)

der make file ist total überflüßige,der wird nicht verwendet. Den kannst du benutzten wenn du das unter linux kompileren willst. Aber alles was du unter Windows brauchst, kannst du im projekt einstellen!


----------



## nameac (5. Dez 2006)

hast du eine idee an welche projekteinstellung mir fehlt als voraussetzung habe ich ein leeres dll projekt erstellt
es erzeugt mir die swig_wrap.c, swig.java und swigJNI.java aber den rest nicht.
ich habe die C/C++ -> zusätzlichen include verzeichnisse angegeben und unter buildereignis -> postbuildereignis die einstellungen übernommen sonst konnte ich keine unterschiede feststellen.


----------



## WieselAc (5. Dez 2006)

Dann hast du ja fast alles. Musst nur noch ne dll aus der wrap und deiner original c/c++ datei machen.


----------



## nameac (6. Dez 2006)

ne irgendwas scheint zufehlen


```
------ Neues Erstellen gestartet: Projekt: swig, Konfiguration: Debug Win32 ------
Die Zwischen- und Ausgabedateien für das Projekt "swig" mit der Konfiguration "Debug|Win32" werden gelöscht.
Ein benutzerdefinierter Buildschritt wird ausgeführt.
In order to function correctly, please ensure the following environment variables are correctly set:
JAVA_INCLUDE: D:\Programme\Java\jdk1.5.0_06\include
JAVA_BIN: D:\Programme\Java\jdk1.5.0_06\bin
e:\c_progs\swig\swig>D:\Programme\swigwin-1.3.29\swig.exe -java e:\c_progs\swig\swig\swig.i 
e:\c_progs\swig\swig>if errorlevel 1 goto VCReportError 
e:\c_progs\swig\swig>goto VCEnd 
Kompilieren...
swig_wrap.c
Kompilieren...
swig.cpp
Manifest in Ressourcen wird kompiliert...
Verknüpfen...
   Bibliothek "E:\c_progs\swig\Debug\swig.lib" und Objekt "E:\c_progs\swig\Debug\swig.exp" werden erstellt.
swig_wrap.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_gcd" in Funktion "_Java_exampleJNI_gcd@16".
swig_wrap.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_Foo".
E:\c_progs\swig\Debug\swig.dll : fatal error LNK1120: 2 nicht aufgelöste externe Verweise.
Das Buildprotokoll wurde unter "file://e:\c_progs\swig\swig\Debug\BuildLog.htm" gespeichert.
swig - 3 Fehler, 0 Warnung(en)
========== Alles neu erstellen: 0 erfolgreich, Fehler bei 1, 0 übersprungen ==========
```


----------



## WieselAc (6. Dez 2006)

Poste mal deinen i file so wie das aussieht hast du da die includes oder so vergessen. 

Im Notfall lieber erstamal über die Commando Zeile die wrap erstellen lassen!


----------



## nameac (6. Dez 2006)

ich habe für das i file und die cpp datei den code aus dem simple bsp genommen und die config für das i file übernommen und angepasst

Befehlszeile:
echo In order to function correctly, please ensure the following environment variables are correctly set:
echo JAVA_INCLUDE: %JAVA_INCLUDE%
echo JAVA_BIN: %JAVA_BIN%
echo on
D:\Programme\swigwin-1.3.29\swig.exe -java $(InputPath)
Ausgaben:
$(InputName)_wrap.c


----------



## WieselAc (6. Dez 2006)

Moment machst du jetzt ein c oder ein c++ Projekt?? 

Bei SWIG gibt es da unterschiede, wenn du ein C++ Projekt hast musst du die Ausgabedatei um lenken und swig mit der option -c++ aufrufen


Etwa so in der Art:


```
swig –c++ –o output_wrap.cpp –java –package swig.example example.i
```


----------



## nameac (6. Dez 2006)

der code steht in einer cpp datei aber das projekt C/C++
ich hab die zeile mal unter befehlszeile so geschrieben aber das gab

------ Neues Erstellen gestartet: Projekt: swig, Konfiguration: Debug Win32 ------
Die Zwischen- und Ausgabedateien für das Projekt "swig" mit der Konfiguration "Debug|Win32" werden gelöscht.
Ein benutzerdefinierter Buildschritt wird ausgeführt.
In order to function correctly, please ensure the following environment variables are correctly set:
JAVA_INCLUDE: D:\Programme\Java\jdk1.5.0_06\include
JAVA_BIN: D:\Programme\Java\jdk1.5.0_06\bin
e:\c_progs\swig\swig>D:\Programme\swigwin-1.3.29\swig.exe -c++ -o swig_wrap.cpp -java e:\c_progs\swig\swig\swig.i 
e:\c_progs\swig\swig>if errorlevel 1 goto VCReportError 
e:\c_progs\swig\swig>goto VCEnd 
Kompilieren...
swig_wrap.c
Kompilieren...
swig.cpp
Manifest in Ressourcen wird kompiliert...
Verknüpfen...
   Bibliothek "E:\c_progs\swig\Debug\swig.lib" und Objekt "E:\c_progs\swig\Debug\swig.exp" werden erstellt.
swig_wrap.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_gcd" in Funktion "_Java_exampleJNI_gcd@16".
swig_wrap.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_Foo".
E:\c_progs\swig\Debug\swig.dll : fatal error LNK1120: 2 nicht aufgelöste externe Verweise.
Das Buildprotokoll wurde unter "file://e:\c_progs\swig\swig\Debug\BuildLog.htm" gespeichert.
swig - 3 Fehler, 0 Warnung(en)
========== Alles neu erstellen: 0 erfolgreich, Fehler bei 1, 0 übersprungen ==========
ein paar andere varianten habe ich auch probiert das gab auch nichts gleiche fehlermeldung nur
die zeile 
e:\c_progs\swig\swig>D:\Programme\swigwin-1.3.29\swig.exe -c++ -o swig_wrap.cpp -java
war entsprechend anders


----------



## WieselAc (6. Dez 2006)

Hmm dann weiß ich auch nitt wirklich weiter. Ich halt sehr viel Konfigurations kram. Da fehlt bestimmt nur irgedn ne Kleinigkeit.


----------



## nameac (6. Dez 2006)

wenn du ein neues projekt erstellst wählst du dann auch unter visual C/C++ ein win32 und dann leeres dll projekt?


----------



## WieselAc (6. Dez 2006)

Ja schon, wobei ich das getrennt von einander mache. Ich mach mein c++ projekt genau so wie immer und dann hab ich mir ne batch geschrieben, die aus den Headern und meinem i-File die JNI Klassen und die Wrapepr erstellt. Die Wrapper importiere ich dann ins projekt und bau mir dann meine dll.


----------



## nameac (6. Dez 2006)

ist das wrap.cxx?


----------



## WieselAc (6. Dez 2006)

ja genau. Oder .cpp jenachdem wie du swig aufrufst


----------



## nameac (7. Dez 2006)

erstellst du ein leeres oder einfaches dll projekt? es kann irgend wie nur noch daran liegen denn es compiliert mir 
die dll aber ich bekomm in java diese exception

```
Exception in thread "main" java.lang.UnsatisfiedLinkError: swigJNI.gcd(II)I
	at swigJNI.gcd(Native Method)
	at swig.gcd(swig.java:12)
	at main.main(main.java:18)
```


----------



## nameac (7. Dez 2006)

ig habs geschafft musste in der wrap.cxx noch unter eigenschaften -> c/C++ -> vorkompilierte haeder keine benutzen einstellen läuft jetz alles über vs 2005 wenn es dich interessiert kann ich dier das projekt hochladen.


----------



## WieselAc (7. Dez 2006)

Ahhh sehr gut, dann kannst du sich ja jetzt mit den eigentlichen Tücken von SWIG beschäfftigen  


hier mal der Link zu dem einzigen Forum das ich gefunden hab. Du wirst es brauchen auch wenn es sehr sehr sehr bescheiden ist:

SWIG-Forum


Muss hier nur C-Header und VS 6.0 verarbeiten. Die dll bestehen schon Ewigkeiten und sollen halt jetzt in Java verwendet werden. Mit deinem Projekt kann ich also leider nciht viel anfangen, aber bei bedarf, nerv ich dich sofort  :bae:


----------



## nameac (7. Dez 2006)

```
double*** a;

double*** getArray(int dim){
a=new double**[dim];
for(int i=0;i<dim;i++){
	a[i]=new double*[dim];
	for(int j=0;j<dim;j++){
		a[i][j]=new double[dim];
		for(int k=0;k<dim;k++){
			a[i][j][k]=4;
		}
	}

}
return a;
}

void Aset(int i, int j, int k, int val) {
a[i][j][k] = val;
}
double Aget(int i, int j, int k) {
return a[i][j][k];
}
```
es compiliert mir den quellcode aber wenn ich in java swig.Aget(1,1,1) aufrufe kommt
#
# An unexpected error has been detected by Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x10011637, pid=1304, tid=1556
#
# Java VM: Java HotSpot(TM) Client VM (1.6.0-rc-b104 mixed mode, sharing)
# Problematic frame:
# C  [swig.dll+0x11637]
#
# An error report file with more information is saved as hs_err_pid1304.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#
nach handbuch hab ich doch nichts falsch gemacht oder;


----------



## WieselAc (7. Dez 2006)

Am besten erklär ich dir jetzt schon mal wie man da rein debuggen kann, dann findest du den fehler bestimmt ruck zuck.

Du startest eclipse oder was du sonst so hast im debug modus, setzt nen Breakpoint vor die Stelle an der es kracht. Dann öffnest du dein VS und und hängst dich an den java prozess ran. 

Dann Stepst du in Java in die Anweisung rein und dein VS meldet sich, sobal ddie Schwelle zu zwischen java und c++ über schritten wurde. jetzt kannst du da wie gewohnt in deinem c++ Code weiter debuggen und gucken was er tut.


----------



## nameac (7. Dez 2006)

danke für den debug tip, der scheint bei mir erst garnicht in den c code zu springen. er fliegt in der klasse ClassLoader in der methode 

```
static long findNative(ClassLoader loader, String name){....
```
raus hier noch das i file ich dachte das du evt schon mal ein komplexeres zeigerarray nach java konvertiert hast
/* File : example.i */
%module swig

%inline %{
extern int    gcd(int x, int y);
extern double Foo;
extern double*** getArray(int dim);
extern void Aset(int i, int j, int k, int val);
extern double Aget(int i, int j, int k);
extern double*** a;
%}

das swig anders als jni mit arrays umgeht hab ich in der docu gelesen deshalb die Aset() und Aget()


----------



## WieselAc (7. Dez 2006)

Du vorderst das Porgramm direkt schon im ersten schritt richtig raus. Probier lieber erstmal einfache sachen. 


C-Point == Java-Array, so einfach ist das leider nicht. 



Wenn es nicht so complex ist hilft die direktive. Ansonsten musst du da explizte "Hilfsmethoden" bauen.


```
%include "arrays_java.i"
```


----------



## nameac (7. Dez 2006)

achso ich dachte ja die hilfs-methoden wären Aset() und Aget() weil man ja leider kein Array zurück bekommt.

was meinst du mit hilfs-methoden?


----------



## WieselAc (7. Dez 2006)

Ja prinzipiell sind die auch richtig, aber es kann sein, das der da trotzdem speicher probleme hat. Hab mit "echten" code noch nitt gearbeitet. 


Wie gesagt musst mich immer mit headern rum schlagen und da bin ich fast nur mit enums, structen und callback pointern beschäftigt.


----------

