Supportvragen Mac > Programmeren in bijvoorbeeld C(++), Cocoa, Java, BASIC, en Swift
Probleem bij Java-C++ koppeling
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:
--- Code: ---g++ -shared FrameGrabber.cpp -o libFrameGrabber.so
--- Einde van code ---
(Bewerkt door minne om 20:11, 22-11-2003)
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!
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 ;)
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:)
--- Code: ---[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%
--- Einde van code ---
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).
--- Code: ---/System/Library/Frameworks/JavaVM.framework/Versions/1.3.1/Headers/jni.h
--- Einde van code ---
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?
Navigatie
[0] Berichtenindex
[#] Volgende pagina
Naar de volledige versie