JNI Android - Conversion de char * en tableau d'octets et retour en java
J'ai d'abord utilisé une fonction pour renvoyer un char* à java en tant que chaîne UTF-8, mais depuis que j'ai continué de faire des erreurs, j'ai écrit la fonction suivante pour retourner un char*
comme Java byte[]
de sorte que je pourrais essayer de convertir le tableau en une Chaîne de caractères en java côté:
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;
}
Mais quand je l'appelle mon application se bloque. Ai-je raté quelque chose?
Mise à jour: La condition manquait un ++ et cela a provoqué une boucle infinie. Mais maintenant, avec le code suivant:
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;
}
- Je obtenir cette étrange JNI avertissement:
06-15 22:40:02.303: W/dalvikvm(7616): JNI AVERTISSEMENT: négatif jsize (NewByteArray)
Comment peut-il être depuis que je suis seulement une augmentation de la valeur de n
?
Mise à jour 2: le code suivant fonctionne:
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;
}
source d'informationauteur Vektor88 | 2013-06-15
Vous devez vous connecter pour publier un commentaire.
Ne devrait pas être présent ?