¿Cómo llamar a las funciones de Java desde C ++?

¿Cómo puedo llamar a las funciones de Java desde una aplicación C ++?

Sé acerca de llamarlos desde CMD (o técnicas similares), pero preferiría no usarlos.

Como ejemplo, verifique Creando una JVM desde C. Muestra un procedimiento de muestra para crear una JVM e invocar un método. Si la JVM ya existe; por ejemplo, su progtwig C es invocado por el progtwig Java (situación de callback), puede almacenar en caché el puntero JNIEnv *.

Como consejo, tenga cuidado con los punteros de almacenamiento en caché de JVM de C / C ++, hay algo de semántica involucrada en cuanto a lo que puede almacenar en caché y podría invocarse más adelante. Para eso, como señaló Brian Agnew, verifique la referencia de JNI.

Consulte la interfaz de Invocación de JNI . Esto le permitirá incrustar una JVM dentro de su aplicación C (o C ++).

Tenga en cuenta que existen varios mecanismos más fáciles para facilitar la invocación de C / C ++ desde Java (por ejemplo, JNA ). Puede valer la pena considerar la inversión de su problema de manera que pueda llamar desde Java (aunque entiendo que esto puede no ser posible para su aplicación particular)

Esta página es útil: http://hildstrom.com/projects/jni/index.html

Supongamos que tiene una clase de Java:

package foo; public class bar { public static int timesTen(int input){ return input * 10; } } 

Una vez que tiene una JVM y JNIEnv * (detalles omitidos …) puede invocar el método Java desde C ++ de la siguiente manera:

 jclass myClass = env->FindClass("foo.bar"); jmethodID mid = env->GetStaticMethodID(myClass, "timesTen", "(I)I"); jint hundred = env->CallStaticIntMethod(myClass, mid, (jint)10); 

Esto pasa por alto una gran cantidad de detalles, incluido el manejo de excepciones, que si se omite bloqueará su JVM. Para todos los detalles sangrientos busque en “Java Native Interface” y siga los enlaces de Oracle.

Lea sobre JNI .

Sun tiene un muy buen y básico ejemplo de JNI .

Otra forma simple de llamar a los métodos de Java desde CPP es a través del archivo por lotes.

 system() 

Es el método para llamar archivos exe o bat desde el CPP. Ponga su clase con la ruta java y la ruta de clase en el archivo por lotes y llame a ese archivo por lotes desde el CPP usando el system("batch-file-name.bat") .

Es fácil y directo.