swig

Status
Nicht offen für weitere Antworten.

nameac

Bekanntes Mitglied
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:
Code:
------ 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?
 

WieselAc

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
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

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

WieselAc

Top Contributor
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

Bekanntes Mitglied
ich versuch grad zufuss so ein projekt nachzubauen welche funktion hat denn das makefile in dem simple projekt
Code:
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

Top Contributor
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

Bekanntes Mitglied
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

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

nameac

Bekanntes Mitglied
ne irgendwas scheint zufehlen

Code:
------ 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

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
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:

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

nameac

Bekanntes Mitglied
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

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

nameac

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

WieselAc

Top Contributor
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

Bekanntes Mitglied
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
Code:
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

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
Code:
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

Top Contributor
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

Bekanntes Mitglied
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
Code:
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

Top Contributor
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.

Code:
%include "arrays_java.i"
 

nameac

Bekanntes Mitglied
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

Top Contributor
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.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben