2012-01-24 19 views
8

Sé que el código Java puede llamar al código C++ a través de JNI. ¿Es posible, sin embargo, llamar al código Java desde C++ nuevamente a través de JNI o ​​con cualquier otro método?¿Puede C++ llamar código Java?

+14

No sabía que Dumbledore le gusta la programación :) –

+4

He oído que es un mago en la materia! – Luminously

+10

@Luminously He visto su código. Es mágico. – mcfinnigan

Respuesta

10

Sí, ciertamente puede. He aquí un ejemplo:

Aquí está el archivo Java:

public class InvocationHelloWorld { 
    public static void main(String[] args) { 
     System.out.println("Hello, World!"); 
     System.out.println("Arguments sent to this program:"); 
     if (args.length == 0) { 
      System.out.println("(None)"); 
     } else { 
      for (int i=0; i<args.length; i++) { 
       System.out.print(args[i] + " "); 
      } 
      System.out.println(); 
     } 
    } 
} 

Y aquí está un poco de C++ que utiliza:

void invoke_class(JNIEnv* env) { 
    jclass helloWorldClass; 
    jmethodID mainMethod; 
    jobjectArray applicationArgs; 
    jstring applicationArg0; 

    helloWorldClass = (env)->FindClass("InvocationHelloWorld"); 
    if(! helloWorldClass) 
    { 
    std::cerr<<"Couldn't get \"InvocationHelloWorld\""<<std::endl; 
    return; 
    } 

    mainMethod = (env)->GetStaticMethodID(helloWorldClass, "main", "([Ljava/lang/String;)V"); 
    if(! mainMethod) 
    { 
    std::cerr<<"Coulnd't get \"InvocationHelloWorld::main\""<<std::endl; 
    return; 
    } 

    applicationArgs = (env)->NewObjectArray(1, (env)->FindClass("java/lang/String"), NULL); 
    applicationArg0 = (env)->NewStringUTF("From-C-program"); 
    (env)->SetObjectArrayElement(applicationArgs, 0, applicationArg0); 

    (env)->CallStaticVoidMethod(helloWorldClass, mainMethod, applicationArgs); 
} 
+0

Perfecto, gracias :-) –

4

También puede utilizar el TRAGO para generar automáticamente los archivos JNI. La configuración puede ser un poco complicado, pero es muy útil cuando se tiene una gran cantidad de código C++ para exponer

http://www.swig.org/index.php

Cuestiones relacionadas