JNI en Android: ¿Cómo recuperar una cadena de código Java?
He leído un montón de ejemplos para recuperar una cadena de java en C / C + + código, pero parece que me falta algo. Este código simple no funciona.
En ActivityTest (código java de android) tengo:
- ¿Todas las cadenas de un programa (en .java) se almacenan en la memoria RAM cuando se inicia (Android)?
- ¿Qué es la consola.log () de java?
- Actualizar los contenidos de recyclerview fallan en la hoja inferior
- No se encontraron archivos Java que amplíen CordovaActivity. Cuando se usa "cordova build"
- Httpclient desaconsejado
public static native void nativeInit(String stringfromjava);
En TestActivity tengo:
ActivityTest.nativeInit("test");
Y en mi test-jni.c:
JNIEXPORT void JNICALL Java_com_test_jni_ActivityTest_nativeInit(JNIEnv* env, jclass cls, jobject obj, jstring stringfromjava){ __android_log_print(ANDROID_LOG_INFO, "TESTJNI","Native Init started"); const char* w_buf = (*env)->GetStringUTFChars(env, stringfromjava, 0); if(w_buf == NULL) { __android_log_print(ANDROID_LOG_INFO, "TESTJNI","file path recv nothing"); } else { __android_log_print(ANDROID_LOG_INFO, "TESTJNI","String: %s", w_buf); } (*env)->ReleaseStringUTFChars(env, stringfromjava, w_buf); }
Pero en mi logcat recibo sólo:
I/TESTJNI (18921): Native Init started I/TESTJNI (18921): String:
¿Dónde estoy equivocado …?
FIXED Gracias a Mario, eliminar "jobject obj" de la firma arregló mi problema!
- Puntero de la cabeza FileOutputStream
- Donde se asigna la memoria cuando declaramos estática?
- redimensionar una matriz de bytes en android
- no llamar a través de super.oncreate y estoy seguro de que añadió thet super.oncreate
- Cómo crear un mapa interactivo en Android
- Android: dar una vista web esquinas redondeadas?
- Píxeles a las inmersiones, al escritorio y al android
- ASyncTask en Executor y PriorityBlockingQueue
Sólo escribí una prueba corta hasta ahora (similar a tu programa), pero mi función tenía una firma un poco diferente (podría depender de SDK / NDK / JDK versión? Lo tomó de algún código tutorial que encontré):
extern "C" void Java_com_whatever_Activity_method(JNIEnv* env, jobject jthis, jstring param);
Obviamente, no necesitará extern "C"
si no está escribiendo C ++.
La firma de Java sería:
native void method(String param);
Editar:
Para obtener la cadena (no estoy seguro si esto es 100% correcto, pero funciona):
const char *cparam = env->GetStringUTFChars(param, 0); // .. do something with it env->ReleaseStringUTFChars(param, cparam);
Abierto a las sugerencias en caso de que haya algo mal allí. Funciona bien, pero todavía puede ser un problema, así que no dude en comentar.
- Cómo manejar mantener vivo la conexión en android
- La aplicación sale automáticamente sin ninguna advertencia o error