Buscar
Social
Ofertas laborales ES

Foro sobre Java EE > Llamada a un método Java desde un método de un programa c

Buenas tardes,

EStoy implementando un módulo para una aplicación que utiliza lenguaje C y lenguaje Java.

En alguna ocasión he utilizado JNI para llamar desde Java a C, como por ejemplo el siguiente método implementado en el programa C:

JNIEXPORT void JNICALL
Java_org_videolan_vlc_gui_video_VirtualActivity_suma(JNIEnv* env, jobject obj){


int a=8;
int b=2;
int c;

LOGI("picture.c - valores de a y b: %d y %d \n", a, b);


// Obtenemos el method ID
jclass clase = (*env)->FindClass(env,"org.videolan.vlc.gui.video.VirtualActivity");
if (clase == NULL) {
printf("Unable to find org.videolan.vlc.gui.video.VirtualActivity\n");
return 1;
}
LOGI("LLamada a la clase VirtualActivity");

jmethodID methodID = (*env)->GetMethodID(env,clase,"sumaJava","(II)I");
if (methodID == NULL) {
printf("Unable to find the sumaJava() method\n");
return 1;
}
LOGI("En dicha clase, llamada al método sumaJava");


// Ejecutamos el metodo
c = (*env)->CallIntMethod(env,obj,methodID,a,b);
LOGI("La suma de %d y %d es %d\n",a,b,c);

}

Y en la clase VirtualActivity.java, cargaría la librería, pondría la declaración del método nativo y el método sumaJava().

MI problema es que quiero pasar arrays desde un método c puro a Java y no sé cómo se inicializan las variables de JNI. Lo he intentado con diferentes códigos pero no lo consigo. POr ejemplo,

JNIEnv* create_vm(){
LOGI("Estoy en el método create_vm");
JavaVM *jvm;
JNIEnv *env;
JavaVMInitArgs vm_args;
jint res;

JavaVMOption options[1];

options[0].optionString = "-Djava.class.path=/home/vmg/android/android/vlc-android/src/";

vm_args.version = JNI_VERSION_1_2;
vm_args.nOptions = 1;
vm_args.options = &options;
vm_args.ignoreUnrecognized = JNI_FALSE;

res = JNI_CreateJavaVM(&jvm, (void **) &env, &vm_args);
if (res < 0){
fprintf(stderr, "Can't create Java VM\n");
exit(1);
}
LOGI("Voy a salir del método create_vm");

return env;
}

void invoke_class(JNIEnv *env){
LOGI("Estoy en el método invoke_class");
jclass helloWorldClass;
jmethodID mainMethod;
jobjectArray applicationArgs;
jstring applicationArg0;

LOGI("Punto en el que voy a utilizar el puntero env");
helloWorldClass = (*env)->FindClass(env, "VirtualActivity");
LOGI("llamada a la clase VirtualActivity");
mainMethod = (*env)->GetStaticMethodID(env, helloWorldClass, "main", "([Ljava/lang/String;)V");
LOGI("llamada al método main");

applicationArgs = (*env)->NewObjectArray(env, 1, (*env)->FindClass(env, "java/lang/String"), NULL);

applicationArg0 = (*env)->NewStringUTF(env, "From-C-Program");

(*env)->SetObjectArrayElement(env, applicationArgs, 0, applicationArg0);

(*env)->CallStaticVoidMethod(env, helloWorldClass, mainMethod, applicationArgs);
LOGI("Voy a salir del método invoke_class");

}

pero me da error : "undefined reference JNI_CreateJavaVM". Y he visto que el NDK tiene comentado este método y al incluir el jni.h de "/usr/lib/jvm/java-7-openjdk-amd64/include/jni.h" me dan errores de conflictos.

Ayuda por favor, es urgente!
MUchas gracias

julio 15, 2013 | Unregistered CommenterGMV