Appeller un objet Java depuis C (ou C++)

Appeller un objet Java depuis C (ou C++) - C++ - Programmation

Marsh Posté le 04-10-2002 à 14:24:31    

Bonjour
 
Je dois étendre une application qui à jusqu'ici été développée en C et C++. Mon boss demande que les extensions se fassent en Java... Appeller une méthode C depuis Java, j'arrive... Appeller une méthode Java depuis une méthode C qui a été appellée par une méthode Java c'est aussi possible... mais appeller directement un objet java (càd démarrer du même coup la machine virtuelle) depuis une application C, je n'ai pas trouvé.... Alors si quelqu'un à une info...  
 
merci de votre aide

Reply

Marsh Posté le 04-10-2002 à 14:24:31   

Reply

Marsh Posté le 04-10-2002 à 16:43:19    

Non, "appeler un objet Java", ça n'a pas de sens. Il faut d'abord lancer la machine virtuelle Java, puis ensuite créer l'objet Java dont tu veux invoquer la (ou les) méthodes.
 
Voici le tutoriel donné par Sun pour démarrer une JVM en C.
 
Voici aussi un exemple typique :

Code :
  1. #include <jni.h>
  2. #ifdef _WIN32
  3. #define PATH_SEPARATOR ';'
  4. #else /* UNIX */
  5. #define PATH_SEPARATOR ':'
  6. #endif
  7. #define USER_CLASSPATH "." /* where Prog.class is */
  8. main() {
  9.     JNIEnv *env;
  10.     JavaVM *jvm;
  11.     JDK1_1InitArgs vm_args;
  12.     jint res;
  13.     jclass cls;
  14.     jmethodID mid;
  15.     jstring jstr;
  16.     jobjectArray args;
  17.     char classpath[1024];
  18.     /* IMPORTANT: specify vm_args version # if you use JDK1.1.2 and beyond */
  19.     vm_args.version = 0x00010001;
  20.     JNI_GetDefaultJavaVMInitArgs(&vm_args);
  21.     /* Append USER_CLASSPATH to the end of default system class path */
  22.     sprintf(classpath, "%s%c%s",
  23.             vm_args.classpath, PATH_SEPARATOR, USER_CLASSPATH);
  24.     vm_args.classpath = classpath;
  25.     /* Create the Java VM */
  26.     res = JNI_CreateJavaVM(&jvm,&env,&vm_args);
  27.     if (res < 0) {
  28.         fprintf(stderr, "Can't create Java VM\n" );
  29.         exit(1);
  30.     }
  31.     cls = (*env)->FindClass(env, "Prog" );
  32.     if (cls == 0) {
  33.         fprintf(stderr, "Can't find Prog class\n" );
  34.         exit(1);
  35.     }
  36.     mid = (*env)->GetStaticMethodID(env, cls, "main", "([Ljava/lang/String;)V" );
  37.     if (mid == 0) {
  38.         fprintf(stderr, "Can't find Prog.main\n" );
  39.         exit(1);
  40.     }
  41.     jstr = (*env)->NewStringUTF(env, " from C!" );
  42.     if (jstr == 0) {
  43.         fprintf(stderr, "Out of memory\n" );
  44.         exit(1);
  45.     }
  46.     args = (*env)->NewObjectArray(env, 1,
  47.                         (*env)->FindClass(env, "java/lang/String" ), jstr);
  48.     if (args == 0) {
  49.         fprintf(stderr, "Out of memory\n" );
  50.         exit(1);
  51.     }
  52.     (*env)->CallStaticVoidMethod(env, cls, mid, args);
  53.     (*jvm)->DestroyJavaVM(jvm);
  54. }

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed