2013-06-15 16 views
13

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; 
} 
+2

Se raggiunto questo 'int n = 0; while (pDevs [index] .device_name) { n ++; } sembra un ciclo infinito. – alk

+0

@alk Avevi ragione, ho dimenticato la condizione ++ in the while, ma il codice non funziona ancora. Ho inserito il codice aggiornato. – Vektor88

+0

FYI, l'esempio ciao-jni nella distribuzione NDK di Android mostra come restituire una stringa UTF. –

risposta

9

non dovrebbe essere questo?

char* p = pDevs[index].device_name; 
while(*p++) { 
... 
} 
+3

Hai ragione, ogni volta che riavvio la codifica in C, ho dimenticato tutte le nozioni di base. – Vektor88

Problemi correlati