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:

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!

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 puede mi aplicación acceder a privilegios de nivel de administración en un dispositivo no enraizado?
  • Cómo compartir el diseño IDE en IntelliJ IDEA?
  • Analizador SAX obtener atributo de endelement
  • Actualizar RecyclerView.Adapter después de la intención de la cámara
  • Android: ¿Cómo evitar que la imagen sea escalada en ImageView o ImageButton?
  • ¿Cómo acceder a las cadenas de recursos de la cadena ToString de enum en Android?
  • ¿Cómo administrar el montón nativo?
  • Android desconocidoHostException Facebook SDK
  • Vincular al servicio desde el nuevo Contexto para cambios de configuración o vincular desde el contexto de la aplicación?
  • Extraer los valores de los parámetros de url android
  • Prueba Espresso NestedScrollView - "Error al ejecutar 'desplazamiento a' en vista 'con id:"
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.