probleme mit ant task bei java jni

kaffeemoo

Grünschnabel
hallo,

ich versuche mit einem ant skript eine .dll zu erzeugen, damit ich aus java heraus eine c klasse nutzen kann.
leider findet eclipse die externen libs nicht, obwohl ich sie referenziere. hat jmd eine idee, woran das liegt?

mfg
jo

HTML:
<target name="cc" depends="javah">
<exec dir="c:/cygwin/bin/" executable="c:/cygwin/bin/gcc">
	<arg value="-mno-cygwin" />
	<arg value="-I" />
	<arg value="C:/Programme/Java/jdk1.6.0_04/include" />
	<arg value="-I" />
	<arg value="C:/Programme/Java/jdk1.6.0_04/include/win32" />
	<arg value="-I" />
	<arg value="C:\Programme\OpenCV\cv\include" />
	<arg value="-I" />
	<arg value="C:\Programme\OpenCV\cxcore\include" />
	<arg value="-I" />
	<arg value="C:\Programme\OpenCV\otherlibs\highgui" />
	<arg value="-I" />
	<arg value="C:\Programme\OpenCV\otherlibs\cvcam\include" />
	<arg value="-I" />
	<arg value="C:\Programme\OpenCV\cvaux\include" />
	<arg value="-l" />
	<arg value="cv" />
	<arg value="-l" />
	<arg value="highgui" />
	<arg value="-l" />
	<arg value="cxcore" />
	<arg value="-L" />
	<arg value="C:\Programme\OpenCV\lib" />
	<arg value="-shared" />
	<arg value="-Wl,--add-stdcall-alias" />
	<arg value="-o" />
	<arg value="${basedir}/getFaces.dll" />
	<arg value="${basedir}/getFaces.c" />
</exec>
</target>
 
danke für die idee, ich werde es später mal testen und das ergebnis posten.

ant-contrib hatte ich auch schon ins auge gefasst, leider finde ich aber in der doku keine beschreibung,
wie man den compilerspeicherort übergibt. unter linux mag das alles klappen, aber mit win hakts
doch etwas ... :rolleyes:

grüße
 
also ich hab -v mal übergeben und folgende meldung erhalten:

XML:
     [exec] Reading specs from /usr/lib/gcc/i686-pc-mingw32/3.4.4/specs
     [exec] Configured with: /usr/build/package/orig/test.respin/gcc-3.4.4-3/configure --verbose --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --enable-languages=c,ada,c++,d,f77,pascal,java,objc --enable-nls --without-included-gettext --enable-version-specific-runtime-libs --without-x --enable-libgcj --disable-java-awt --with-system-zlib --enable-interpreter --disable-libgcj-debug --enable-threads=posix --enable-java-gc=boehm --disable-win32-registry --enable-sjlj-exceptions --enable-hash-synchronization --enable-libstdcxx-debug
     [exec] Thread model: posix
     [exec] gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
     [exec]  /usr/lib/gcc/i686-pc-mingw32/3.4.4/cc1.exe -quiet -v -I C:/Programme/Java/jdk1.6.0_04/include -I C:/Programme/Java/jdk1.6.0_04/include/win32 -I C:\Programme\OpenCV\cv\include -I C:\Programme\OpenCV\cxcore\include -I C:\Programme\OpenCV\otherlibs\highgui -I C:\Programme\OpenCV\otherlibs\cvcam\include -I C:\Programme\OpenCV\cvaux\include -D__MSVCRT__ -D__MINGW32__ -DWIN32 -D_WIN32 -D__WIN32 -D__WIN32__ -DWINNT -idirafter /usr/lib/gcc/i686-pc-mingw32/3.4.4/../../../../include/w32api -idirafter /usr/lib/gcc/i686-pc-mingw32/3.4.4/../../../../i686-pc-mingw32/lib/../../include/w32api J:\Workspace\da_jungkunst/getFaces.c -quiet -dumpbase getFaces.c -mno-cygwin -mtune=pentiumpro -auxbase getFaces -version -o /cygdrive/c/DOKUME~1/evil/LOKALE~1/Temp/ccfpu4Zq.s
     [exec] ignoring nonexistent directory "/usr/local/include/mingw"
     [exec] ignoring duplicate directory "/usr/include/mingw"
     [exec] ignoring duplicate directory "/usr/lib/gcc/i686-pc-mingw32/3.4.4/../../../../i686-pc-mingw32/lib/../../include/w32api"
     [exec] #include "..." search starts here:
     [exec] #include <...> search starts here:
     [exec]  C:/Programme/Java/jdk1.6.0_04/include
     [exec]  C:/Programme/Java/jdk1.6.0_04/include/win32
     [exec]  C:/Programme/OpenCV/cv/include
     [exec]  C:/Programme/OpenCV/cxcore/include
     [exec]  C:/Programme/OpenCV/otherlibs/highgui
     [exec]  C:/Programme/OpenCV/otherlibs/cvcam/include
     [exec]  C:/Programme/OpenCV/cvaux/include
     [exec]  /usr/lib/gcc/i686-pc-cygwin/3.4.4/include
     [exec]  /usr/lib/gcc/i686-pc-mingw32/3.4.4/../../../../i686-pc-mingw32/include
     [exec]  /usr/lib/gcc/i686-pc-mingw32/3.4.4/../../../../include/w32api
     [exec] End of search list.
     [exec] GNU C version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125) (i686-pc-cygwin)
     [exec] 	compiled by GNU C version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125).
     [exec] GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
     [exec]  /usr/lib/gcc/i686-pc-mingw32/3.4.4/../../../../i686-pc-mingw32/bin/as.exe -o /cygdrive/c/DOKUME~1/user/LOKALE~1/Temp/cchmKpiU.o /cygdrive/c/DOKUME~1/user/LOKALE~1/Temp/ccfpu4Zq.s
     [exec]  /usr/lib/gcc/i686-pc-mingw32/3.4.4/collect2.exe --shared -Bdynamic -e _DllMainCRTStartup@12 -o J:\Workspace/getFaces.dll /usr/lib/gcc/i686-pc-mingw32/3.4.4/../../../../i686-pc-mingw32/lib/dllcrt2.o -L/usr/lib/gcc/i686-pc-mingw32/3.4.4 -L/usr/lib/gcc/i686-pc-mingw32/3.4.4 -L/usr/lib/gcc/i686-pc-mingw32/3.4.4/../../../../i686-pc-mingw32/lib -L/usr/lib/gcc/i686-pc-mingw32/3.4.4/../../.. --add-stdcall-alias /cygdrive/c/DOKUME~1/user/LOKALE~1/Temp/cchmKpiU.o -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt -lmingw32 -luser32 -lkernel32 -ladvapi32 -lshell32 -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt
     [exec] /cygdrive/c/DOKUME~1/user/LOKALE~1/Temp/cchmKpiU.o:getFaces.c:(.text+0x851): undefined reference to `_cvFree_'
     [exec] /cygdrive/c/DOKUME~1/user/LOKALE~1/Temp/cchmKpiU.o:getFaces.c:(.text+0x8bf): undefined reference to `_cvFree_'
     [exec] /cygdrive/c/DOKUME~1/user/LOKALE~1/Temp/cchmKpiU.o:getFaces.c:(.text+0x9a4): undefined reference to `_cvGetRows'
     [exec] /cygdrive/c/DOKUME~1/user/LOKALE~1/Temp/cchmKpiU.o:getFaces.c:(.text+0x9cd): undefined reference to `_cvGetCols'
     [exec] /cygdrive/c/DOKUME~1/user/LOKALE~1/Temp/cchmKpiU.o:getFaces.c:(.text+0x9e0): undefined reference to `_cvReleaseMat'
     [exec] /cygdrive/c/DOKUME~1/user/LOKALE~1/Temp/cchmKpiU.o:getFaces.c:(.text+0xaf2): undefined reference to `_cvAddS'
     [exec] /cygdrive/c/DOKUME~1/user/LOKALE~1/Temp/cchmKpiU.o:getFaces.c:(.text+0xb34): undefined reference to `_cvSeqSlice'
     [exec] /cygdrive/c/DOKUME~1/user/LOKALE~1/Temp/cchmKpiU.o:getFaces.c:(.text+0xb88): undefined reference to `_cvSetAdd'
     [exec] /cygdrive/c/DOKUME~1/user/LOKALE~1/Temp/cchmKpiU.o:getFaces.c:(.text+0xc06): undefined reference to `_cvGetSeqElem'
     [exec] /cygdrive/c/DOKUME~1/user/LOKALE~1/Temp/cchmKpiU.o:getFaces.c:(.text+0xcf9): undefined reference to `_cvEllipse'
     [exec] /cygdrive/c/DOKUME~1/user/LOKALE~1/Temp/cchmKpiU.o:getFaces.c:(.text+0xd3f): undefined reference to `_cvInitFont'
     [exec] /cygdrive/c/DOKUME~1/user/LOKALE~1/Temp/cchmKpiU.o:getFaces.c:(.text+0xdfb): undefined reference to `_cvGetFileNodeByName'
     [exec] /cygdrive/c/DOKUME~1/user/LOKALE~1/Temp/cchmKpiU.o:getFaces.c:(.text+0xe7f): undefined reference to `_cvGetFileNodeByName'
     [exec] /cygdrive/c/DOKUME~1/user/LOKALE~1/Temp/cchmKpiU.o:getFaces.c:(.text+0xee7): undefined reference to `_cvGetFileNodeByName'
     [exec] /cygdrive/c/DOKUME~1/user/LOKALE~1/Temp/cchmKpiU.o:getFaces.c:(.text+0xf19): undefined reference to `_cvGetFileNodeByName'
     [exec] /cygdrive/c/DOKUME~1/user/LOKALE~1/Temp/cchmKpiU.o:getFaces.c:(.text+0xf31): undefined reference to `_cvRead'
     [exec] collect2: ld returned 1 exit status
     [exec] Result: 1
 
Zuletzt bearbeitet von einem Moderator:
Versuch mal
XML:
<arg value="-lcv" />

statt
XML:
<arg value="-l" />
<arg value="cv" />

(für die restlichen dann auch entsprechend).

Denn die libs tauchen in dem gcc Aufruf gar nicht auf, also hat er die wohl so nicht erkannt.
 
Zuletzt bearbeitet von einem Moderator:
Ändert sich leider gar nix, nicht einmal in der Ausgabe.
Ich bin da echt schon etwas ratlos ...

Ich würde ja ant-contrib anstatt nehmen, aber es gibt in meinen Augen kein tag im cc task,
womit man den ort des compilers angeben kann und "gcc" findet eclipse net.
:confused:
 
Liegt es vielleicht daran, das ich mingw nehme und der mit den Linker nicht klar kommt?
Hab es jetzt auch mit dem cc task ausprobiert und da kommt der selbe Fehler ...
 
So nun hab ich mal für dich auf meiner Windows Platte nachgeschaut, ich habe ja sowas auch mal gemacht. Allerdings hatte ich das auch nicht über das buildfile hinbekommen. Stattdessen hab ich nen makefile erstellt und das wiederum über das buildfile aufgerufen. Das funktioniert wunderbar.

Das Makefile sieht so aus:
Code:
RM = del /q

CC = g++



OPENCV_PATH = C:\Programme\OpenCV

JDK_PATH = C:\Programme\Java\jdk1.6.0



MINGW_LIB = "C:\Programme\MinGW\lib"



OPENCV_LIB = "$(OPENCV_PATH)\lib"

CV_INC = "$(OPENCV_PATH)\cv\include"

CXCORE_INC = "$(OPENCV_PATH)\cxcore\include"

HIGHGUI_INC = "$(OPENCV_PATH)\otherlibs\highgui"

CVCAM_INC = "$(OPENCV_PATH)\otherlibs\cvcam\include"



JNI_LIB = "$(JDK_PATH)\lib"

JNI_INC = "$(JDK_PATH)\include"

JNI_WIN32_INC = "$(JDK_PATH)\include\win32"

			

INCLUDES = -I$(CV_INC) -I$(CXCORE_INC) -I$(HIGHGUI_INC) -I$(CVCAM_INC)

LIBS = -L$(OPENCV_LIB) -L$(MINGW_LIB)



LINKLIBS = -lcv -lcxcore -lhighgui -lcvcam -lgdi32



SRC = ./src/

DLL = ./dll/



EXT = .dll



COMPILERARGS_DEBUG = -O0 -g3 -Wall -c -fmessage-length=0

COMPILERARGS_RELEASE = -O3 -Wall -c -fmessage-length=0

COMPILERARGS = $(COMPILERARGS_RELEASE)



JAVACV = opencv_swt



OBJECTS = opencvext.o



all: compile

	$(CC) -shared -Wl,--add-stdcall-alias $(LIBS) -o $(DLL)$(JAVACV)$(EXT) $(OBJECTS) $(LINKLIBS)

	

compile:

	$(CC) $(INCLUDES) $(COMPILERARGS) -o opencvext.o $(SRC)opencvext.cpp

Die build.xml:
XML:
<project default="make" basedir=".">



	<property name="jdk.home" location="C:/Programme/Java/jdk1.6.0" />

	<property name="opencv.home" location="C:/Programme/OpenCV" />

	<property name="compiler.home" location="C:/Programme/MinGW/bin" />

	<property name="output.name" value="opencv_swt" />

	

	<target name="make" depends="javah">

		<exec dir="${basedir}" executable="${compiler.home}/mingw32-make">

			<arg value="all" />

		</exec>

		<copy toDir="${basedir}" file="${basedir}/dll/${output.name}.dll" />

	</target>



	<target name="clean">

		<delete>
			<fileset dir=".">
				<include name="*.o" />
			</fileset>
		</delete>

		<delete>

			<fileset dir="dll">

				<include name="*.dll" />

			</fileset>

		</delete>

		<delete dir="bin"/>

	</target>



</project>
 
Zuletzt bearbeitet von einem Moderator:
Vielen Dank zeja,

das du dich in die Untiefen deines Rechners begeben hast ;-)
Ich hätte jetzt nur noch eine Frage und zwar, was steht in
deiner .cpp Datei.
Ich habe mir immer nur die .h generieren lassen und dann
die passende .c Datei entwickelt.

grüße jo
 
Zurück