Comment lire un objet bytearray dans JNI?
Est-il possible de faire référence à un ensemble de bytearray dans JNI, mais pas d'invoquer une copie ?
En natif le code en C, j'ai un bytearray passant de Java, et je veux juste comparer certaines données de ce bytearray donc je ne veux pas faire de copie de mémoire. Est-il possible ?
Je sais que je pourrais obtenir le pointeur de l'objet bytearray en natif en utilisant GetPrimitiveArrayCritical quelque chose comme ça
JNIEXPORT jbyteArray JNICALL Java_nfore_android_bt_pro_nfhfp_dsp
(JNIEnv *env, jobject jobj, jbyteArray jbIn, jbyteArray jbBase){
jbyte *bufferIn;
jbyte *bufferBase;
bufferIn = (*env)->GetPrimitiveArrayCritical(env, jbIn, NULL);
LOGD("Begin of dsp()");
LOGD("In dsp() Before Comparing...");
//Compare bufferIn with bufferBase here...
LOGD("In dsp() After Comparing...");
LOGD("End of dsp()");
(*env)->ReleasePrimitiveArrayCritical(env, jbIn, bufferIn, 0);
return jbIn;
}
Comme vous avez pu le voir, parce que je pourrait modifier les données dans la jbIn, je devrais utiliser GetPrimitiveArrayCritical pour obtenir son pointeur et de libérer plus tard.
Cependant, si je veux juste LIRE la bytearray jbBase, comment pourrais-je obtenir le pointeur de la jbBase mais de ne pas utiliser GetPrimitiveArrayCritical ?
Toute suggestion serait la bienvenue. Merci beaucoup.
OriginalL'auteur Bohan Lu | 2011-07-18
Vous devez vous connecter pour publier un commentaire.
J'utilise la suite de lire les tableaux d'octets...
Vous avez encore besoin de le sortir en que cesse le Garbage collector s'en débarrasser potentiellement pendant que vous êtes encore à l'utiliser.
Il ne fixe pas de mode exclusif, mais si vous êtes seulement à la lecture de la matrice de l'accès simultané devrait être OK. Si elle peut être écrite simultanément alors vous aurez besoin d'utiliser les mutex ou synchroniser. Je ne suis pas sûr si il fait une copie, aussi loin que je peux dire, elle retourne un pointeur sur le tableau, je l'utilise pour une haute performance codec et je n'ai jamais remarqué de copier le tableau, bien qu'il soit difficile de dire si elle a fait une copie.
OK, je l'ai eu. Merci pour votre aide Jim.
Au lieu de NULL, ne pourriez-vous pas passer dans un bool référence pour le "isCopy" paramètre de GetByteArrayElements() pour déterminer si une copie a été faite? Ou suis-je mal comprendre le but de ce paramètre?
OriginalL'auteur Jim Morris
GetByteArrayElements méthode ne garantit pas que votre utilisation du programme de référence ou de la copie. JNI retour isCopy drapeau de l'état objet copié ou épinglé(pin moyens de référence). Si vous ne voulez pas copier jamais, vous n'avez pas à utiliser GetArrayElements méthodes, car elle renvoie toujours copier(JVM décide de copier ou non, et probablement copier préféré parce que la copie allège le fardeau de Garbage Collector). Je l'ai essayé et j'ai vu que ma ram a augmenté lors de l'envoi d'un grand tableau. Vous pouvez également voir au lien ci-dessous:
IBM copie et de pin (regardez la copie et la broche de l'objet de l'arborescence)
Que le document dit,GetPrimitiveArrayCritical renvoie directement tas adresse d'un tableau Java, la désactivation de la collecte des ordures jusqu'à ce que le correspondant ReleasePrimitiveArrayCritical est appelé. Si vous devez utiliser que GetPrimitiveArrayCritical, si vous ne voulez pas copier(u besoin que lorsque vous avez un grand tableau). Si l'on regarde votre code, vous pouvez obtenir de tableau un par un, comme ci-dessous(je suppose que vous avez envoyé int tableau comme une jobject à JNI fonction):
Note importante: Vous ne pouvez pas GetArrayLength après GetPrimitiveArrayCritical car JNI n'a pas de programme de permis d'appeler n'importe quelle fonction JNI pour le même objet entre les critiques et la libération des méthodes.
OriginalL'auteur Mustafa Kemal