![]() |
Re: JNI gesucht
|
Re: JNI gesucht
Das Problem kenne ich auch noch, unser Rückfallnetz besteht aus zwei ISDN Kanälen, entsprechend perfomant geht es dann voran (es müssen sich halt nur genug Leute 128 KBit teilen). Da war es dann auch immer schneller Dinge woanders runterzuladen und dann am nächsten Tag weiter zu machen. Aber im Moment wird mal keine Leitung durch Bagger zerstört und das Netz ist schnell (>>> 128 KBit).
Andererseits würde ich mich auch gern mal dafür bezahlen lassen ;-) [edit] @kalmi01 Ohne für Luckie sprechen zu wollen sprach er davon, dass er C verwenden möchte. Da man in letzter Zeit häufiger Luckie und C im selben Thread trifft dürfte er auch wirklich was in C machen wollen [/edit] |
Re: JNI gesucht
So, soweit scheint es zu funktionieren. Bis auf eine Fehlermeldung vom Linker: "undefined reference to `JNI_JNI_CreateJavaVM'". Muss ich da noch irgendwie eine lib-Datei linken oder so?
|
Re: JNI gesucht
Nein, aber du musst das include Verzeichnis komplett in deine C Umgebung (per Include Schalter) einbinden. Eigentlich sollte dann alles klappen. Andererseits heißt das ja in der Regel nicht viel.
[edit] Achso, im Include Verzeichnis gibt es noch ein weiteres Systemspezifisches Verzeichnis, dass du auch in den Include pfad packen musst. [/edit] |
Re: JNI gesucht
Hm:
Code:
Ändert leide rnichts an der Fehlermeldung. Der Compiler gibt allerdings schon eine warnung auis:
-I"C:\Programme\Java\jdk1.5.0_07\include\*" -I"C:\Programme\Java\jdk1.5.0_07\include\win32\*" -O0 -g3 -Wall -c -fmessage-length=0
Zitat:
|
Re: JNI gesucht
Ok,
ehrlich gesagt wundert es mich, dass der von dir gepostete C Code so überhaupt laufen sollte. Ich hab mal die Datei etwas abgeändert (bei mir fehlten 2 schließende Blöcke und die vmArgs müssen vom Typ JvmInitArgs sein).
Code:
Das ganze hab ich dann durch den Borland C Compiler gejagt :
#include <stdio.h>
#include "jni.h" int main() { JavaVMOption options[1]; JNIEnv *env; JavaVM *jvm; JavaVMInitArgs vm_args; long status; jclass cls; jmethodID mid; jint square; jboolean not; options[0].optionString="-Djava.class.path=."; memset(&vm_args, 0, sizeof(vm_args)); vm_args.version = JNI_VERSION_1_2; vm_args.nOptions = 1; vm_args.options = options; status = JNI_CreateJavaVM(&jvm,(void**)&env,&vm_args); if (status != JNI_ERR) { cls = (*env)->FindClass(env, "HelloWorld"); if (cls != 0) {mid = (*env)->GetStaticMethodID(env,cls,"Test","(I)I");} if (mid != 0) {square = (*env)->CallStaticIntMethod(env,cls,mid,5); } printf("Result of int Method:%d\n", square); (*jvm)->DestroyJavaVM(jvm); return 0; } else return -1; }
Code:
Und das compiliert ohne Probleme. Gelinkt habe ich den Code jetzt zwar nicht, aber ich denke mal die Probleme hattest du auch schon beim Compilieren?
bcc32 -I"C:\Programme\Java\jdk1.5.0_08\include" -I"C:\Programme\Java\jdk1.5.0_08\include\win32" "Blubb.c"
|
Re: JNI gesucht
Wenn ich deinen Code mit MinGW kompiliere, bekomme ich folgende Fehlermeldungen:
Code:
**** Full rebuild of configuration Debug for project Direct Soap Bridge Exe Demo **** mingw32-make clean all rm -rf ./ExeDemo.o ./ExeDemo.d DirectSoapBridgeExeDemo.exe process_begin: CreateProcess((null), rm -rf ./ExeDemo.o ./ExeDemo.d DirectSoapBridgeExeDemo.exe, ...) failed. make (e=2): Das System kann die angegebene Datei nicht finden. mingw32-make: [clean] Error 2 (ignored) ' ' 'Building file: ../ExeDemo.c' 'Invoking: GCC C Compiler' mingw32-gcc -I"C:\Programme\Java\jdk1.5.0_07\include" -I"C:\Programme\Java\jdk1.5.0_07\include\win32" -O0 -g3 -Wall -c -fmessage-length=0 -oExeDemo.o ../ExeDemo.c ../ExeDemo.c: In function `main': ../ExeDemo.c:16: warning: implicit declaration of function `memset' ../ExeDemo.c:29: warning: int format, jint arg (arg 2) ../ExeDemo.c:36:2: warning: no newline at end of file 'Finished building: ../ExeDemo.c' ' ' 'Building target: DirectSoapBridgeExeDemo.exe' 'Invoking: GCC C Linker' mingw32-gcc -oDirectSoapBridgeExeDemo.exe ./ExeDemo.o ./ExeDemo.o(.text+0x75): In function `main': D:/Projekte Datawerk/PVS/SVN/branches/Eclipse_mp/Direct_SOAP_Bridge_DLL/JNI/C-Programm/Debug/../ExeDemo.c:20: undefined reference to `_imp__JNI_CreateJavaVM@12' collect2: ld returned 1 exit status mingw32-make: *** [DirectSoapBridgeExeDemo.exe] Error 1 Build complete for project Direct Soap Bridge Exe Demo |
Re: JNI gesucht
Hm, sorry, mit minGW kenne ich mich jetzt nicht wirklich aus. Also bei Cygwin konnte man nie direkt auf ein Verzeichnis zugreifen. Da musste man den Umweg über das virtuelle Verzeichnis cyIrgendwas (nicht mehr im Kopf) gehen. Aber das sollte hier nicht das Problem sein. Vielmehr stellt dir minGW doch eine andere (unix) Umgebung zur Verfügung. Da weiß ich nicht in wie weit die Bibliotheken aus ...\include\win32 verwendet werden können. Hier sind immerhin plattformabhängige Aufrufe und Deklarationen drin. Daran kann es also (mit dem Compiler) scheitern. Hast du es einfach nur mit einem "normalen" C Compiler versucht? (mache ja schließlich auch gerne Fehler!)
|
Re: JNI gesucht
Das ist die Windows Version des Compilers. Ich habe damit schon erfolgreich normale Exe-FDateien, wie auch DLLs kompilieren können. Und was ist ein "normaler" C-Compiler?
|
Re: JNI gesucht
Ok, hab wohl nicht mitbekommen, dass MinGW einfach eine echt Portierung ist. Dachte ist nur minimaler als Cygwin aber wieder mit DLL die beiliegen muss. Gut, dann nehme ich auch das zurück.
Das Problem dass du hast, habe ich beim Linken auch (ich hätte nicht nur compilieren sollen). Es liegt daran, dass das Erzeungen der JVM nicht gelinkt werden kann. Statisch ist dies auch nicht möglich, da du auf jedem System die jvm an einem anderen Ort finden wirst. Du musst die Methode JNI_CreateJavaVM gegen die jvm.dll linken. Hier kann ich dir leider nichts genaueres sagen (mit meinem C ist's nicht all zu weit her). Du findest aber eine Delphi Implementierung, wie man diese Dll lädt und eine neue Instanz erzeugt, die dir weiterhelfen dürfte. Ich möchte hier nur auf den Download ![]() Der Ort, andem du die jvm.dll findest ist in der Registry unter HKLM\Software\JavaSoft\Java Runtime Environment\1.x als Runtimelib zu finden (bei einer Standard Sun JVM). Welches JRE du hier verwendest bleibt natürlich dir überlassen (soweit mehr als eins installiert ist). Ja, dann hoffe ich du kommst damit auch weiter, Gruß Der Unwissende |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz