Inizialmente ho utilizzato una funzione per restituire un char * a java come stringa UTF-8, ma poiché continuavo a ricevere errori, ho scritto la seguente funzione per restituire un char*
come Java byte[]
, così che ho potuto provare a convertire l'array in una stringa in Java lato:JNI Android - Conversione di char * in array di byte e ritorno a 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;
}
Ma quando io lo chiamo la mia applicazione si blocca. Mi sto perdendo qualcosa?
Aggiornamento: La condizione mancava un ++ e questo ha causato un ciclo infinito. Ma ora, con il seguente codice:
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;
}
ottengo questo strano avvertimento JNI:
06-15 22: 40: 02,303: W/dalvikvm (7616): JNI ATTENZIONE: jsize negativo (NewByteArray)
Come può essere poiché sto aumentando solo il valore di n
?
Update 2: il seguente codice funziona:
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;
}
Se raggiunto questo 'int n = 0; while (pDevs [index] .device_name) { n ++; } sembra un ciclo infinito. – alk
@alk Avevi ragione, ho dimenticato la condizione ++ in the while, ma il codice non funziona ancora. Ho inserito il codice aggiornato. – Vektor88
FYI, l'esempio ciao-jni nella distribuzione NDK di Android mostra come restituire una stringa UTF. –