Probleem bij Java-C++ koppeling
22 november 2003 - 20:10   
geplaatst door: minne
Ik ben bezig met een project waarvoor een koppeling tussen Java en C++ benodigd is. Dit gebeurt met JNI. Ik heb een Java-class gemaakt met daarin alle native methods. Vervolgens heb ik javah -ssh FrameGrabber gedaan om de bijbehorende header-file te genereren. Deze header-file include ik in m'n C++-implementatie. Bij het compileren geeft hij echter als fout dat jni.h niet gevonden wordt (deze wordt geinclude in de gegenereerde header-file). Hoe kan dit :confused
Het raarste is nog wel dat als ik met XCode een JNI-project start het includen van jni.h wel gewoon goed gaat. Ik heb hier echter weinig aan omdat ik samen moet werken met PC-mensen en je niet meer zoals vroeger gewoon even de Makefile door kunt spitten (XCode maakt die in tegenstelling tot Project Builder niet).
Ik compileer nu met de volgende regel, misschien moet die anders:

g++ -shared FrameGrabber.cpp -o libFrameGrabber.so

(Bewerkt door minne om 20:11, 22-11-2003)

Probleem bij Java-C++ koppeling
22 november 2003 - 22:15    reactie #1
geplaatst door: mennodeij
Hmm... Het lijkt erop dat je bij je compileren het pad naar jni.h moet meegeven, dus g++ -shared -I/<path to jni.h> FrameGrabber.cpp -o libFrameGrabber.so
Verder moet je een JDK hebben geinstalleerd natuurlijk, maar dat zal wel aangezien het met XCode wel werkt.
Kijk ook nog 's naar de andere compiler opties, zoals optimalisaties -O2 of -O3 en naar -fpic
Weet dus goed wat g++ allemaal kan!
Vu-ja-dé: the odd feeling nothing has ever happened before...
Probleem bij Java-C++ koppeling
23 november 2003 - 13:31    reactie #2
geplaatst door: minne
Maar waar vind ik jni.h? Als ik gewoon zoek naar dat bestand vind ik hem niet. Andere bestanden zoals stdlib.h kan ik op die manier echter ook niet vinden. Ik heb de Panther Developer Tools gewoon normaal geinstalleerd...
JDK staat er op natuurlijk ;)
Probleem bij Java-C++ koppeling
23 november 2003 - 19:14    reactie #3
geplaatst door: Sander Cox
Als je de cron scripts draait voor je mac (via Cocktail bv) dan wordt de locate database aangemaakt. Dan kan je met "locate xxx" het bestand xxx zoeken op je Mac. Gaat razendsnel, maar hij is wel niet altijd actueel moet hem af en toe updaten (vandaar dat het een cron script is :woot:)
[shrek:~] sander% locate  jni.h Onderstaande is de output op mijn machine.
/Developer/Java/Headers/vm-jni.h
/Developer/SDKs/MacOSX10.2.7.sdk/System/Library/Frameworks/JavaVM.framework/Versions/1.3.1/Headers/jni.h
/Developer/SDKs/MacOSX10.2.7.sdk/System/Library/Frameworks/JavaVM.framework/Versions/1.4.1/Headers/jni.h
/Developer/SDKs/MacOSX10.2.7.sdk/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers/jni.h
/Developer/SDKs/MacOSX10.3.0.sdk/System/Library/Frameworks/JavaVM.framework/Versions/1.3.1/Headers/jni.h
/Developer/SDKs/MacOSX10.3.0.sdk/System/Library/Frameworks/JavaVM.framework/Versions/1.4.1/Headers/jni.h
/Developer/SDKs/MacOSX10.3.0.sdk/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers/jni.h
/System/Library/Frameworks/JavaVM.framework/Versions/1.3.1/Headers/jni.h
/System/Library/Frameworks/JavaVM.framework/Versions/1.4.1/Headers/jni.h
/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers/jni.h
[shrek:~] sander%
Probleem bij Java-C++ koppeling
24 november 2003 - 23:27    reactie #4
geplaatst door: minne
Aha :)
Ik kende locate wel, maar dacht dat die hetzelfde deed als de normale Find-functie. Ik zie toevallig dat naast JDK 1.4.1 ook 1.3.1 nog aanwezig is op m'n Mac (van de oude Dev Tools nog).
/System/Library/Frameworks/JavaVM.framework/Versions/1.3.1/Headers/jni.h
Kan ik zo'n map 1.3.1 zomaar verwijderen, of krijg ik dan problemen?

P.S.: M'n koppeling draait inmiddels als een tiet. Het enige waar ik nog niet uit ben is of ik vanuit Java een instantie van een C++-class kan aanmaken. Kan ik dus C++-objecten aanmaken vanuit Java?

Probleem bij Java-C++ koppeling
27 november 2003 - 08:11    reactie #5
geplaatst door: mennodeij
Ziek ook:
http://java.sun.com/docs/books/tutorial/native1.1/index.html
Dit is de JNI documentatie/tutorial van Sun.
Vu-ja-dé: the odd feeling nothing has ever happened before...
Probleem bij Java-C++ koppeling
27 november 2003 - 08:44    reactie #6
geplaatst door: minne
Die tutorial bevat alleen een JNI Hello World, net zoals vrijwel alle tutorials over JNI :(
Wat ze er vergeten bij te noemen is dat het allemaal maar erg onstabiel is, zeker als je grote arrays probeert door te geven via JNI. Instanties van C-classes maken heb ik nergens kunnen vinden, het lijkt erop dat je alleen static native methods kunt aanroepen vanuit Java...
Probleem bij Java-C++ koppeling
27 november 2003 - 12:41    reactie #7
geplaatst door: mennodeij
Hmm.... Je kunt een C++ functie aanroepen vanuit Java, dus als je in die functie objecten aanmaakt, dan kan het wel ja. Maar dat worden niet zomaar spontaan Java objecten.
Vu-ja-dé: the odd feeling nothing has ever happened before...
Probleem bij Java-C++ koppeling
27 november 2003 - 12:43    reactie #8
geplaatst door: mennodeij
Vu-ja-dé: the odd feeling nothing has ever happened before...
Probleem bij Java-C++ koppeling
30 november 2003 - 22:24    reactie #9
geplaatst door: minne
Dat ziet er interessant uit :)