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");
// 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;
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");
(*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.
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