JNI Android – Convertir char * en matriz de bytes y devolverlo a java
Inicialmente utilicé una función para devolver un char * a java como cadena UTF-8, pero como seguía recibiendo errores, escribí la siguiente función para devolver un char*
como un byte[]
Java byte[]
, para que pudiera intentar convertir el Matriz en una cadena en el lado java:
jbyteArray Java_com_vektor_amapper_util_InputDeviceManager_getDevNameBytes(JNIEnv* env, jobject thiz, jint index) { if(pDevs[index].device_name == NULL) return NULL; int n=0; while(pDevs[index].device_name){ n++; } if (n==0) return NULL; jbyteArray arr = (*env)->NewByteArray(env, n); (*env)->SetByteArrayRegion(env,arr,0,n, (jbyte*)pDevs[index].device_name); return arr; }
Pero cuando lo llamo mi aplicación se bloquea. ¿Me estoy perdiendo de algo?
- Temporizadores Android NDK
- No se pueden serializar las fechas con ksoap2
- Cómo configurar Proguard para mantener los métodos estáticos con diferentes tiempos de retorno
- Cómo cambiar la versión java utilizada por los subproyectos cordova
- "Ic_launcher no se puede resolver o no es un campo"
Actualización: La condición faltaba un ++ y esto causó un bucle infinito. Pero ahora con el siguiente código:
jbyteArray Java_com_vektor_amapper_util_InputDeviceManager_getDevNameBytes(JNIEnv* env, jobject thiz, jint index) { int n=0; if(pDevs[index].device_name == NULL) return NULL; while(pDevs[index].device_name++){ n++; } if(n==0) return NULL; jbyteArray arr = (*env)->NewByteArray(env, n); (*env)->SetByteArrayRegion(env,arr,0,n, (jbyte*)pDevs[index].device_name); return arr; }
Tengo esta extraña advertencia de JNI:
06-15 22: 40: 02.303: W / dalvikvm (7616): JNI ADVERTENCIA: jsize negativo (NewByteArray)
¿Cómo puede ser, ya que sólo estoy aumentando el valor de n
?
Actualización 2: el código siguiente funciona:
jbyteArray Java_com_vektor_amapper_util_InputDeviceManager_getDevNameBytes( JNIEnv* env, jobject thiz, jint index) { if(pDevs[index].device_name == NULL) return NULL; int n=0; char* p = pDevs[index].device_name; while(*p++){ n++; } if(n<=0) return NULL; jbyteArray arr = (*env)->NewByteArray(env, n); (*env)->SetByteArrayRegion(env,arr,0,n, (jbyte*)pDevs[index].device_name); return arr; }
- ¿Cómo usar googletest para probar el código C ++ que llama a java en android?
- Android: Descargar un solo archivo en muchas partes
- Android: cambia la cámara cuando se hace clic en el botón
- Android / Java - Publicar texto simple en la pared de Facebook?
- Cómo obtener la ubicación GPS de Android
- Cómo detener todos los subprocesos de trabajo en la aplicación android
- Solicitud de aplicaciones para Android Servicio WCF (SerializationException - utf-8 related)
- Agregar sombra al ShapeDrawable mediante programación
¿No debería ser esto?
char* p = pDevs[index].device_name; while( *p++) { ... }
- ¿Cómo anular la lista de cifrado enviada al servidor por Android cuando se utiliza HttpsURLConnection?
- ¿Por qué se llama DialogFragment.onCreateView cuando se está destruyendo la actividad?