|
II. Possibilités offertes par le JNI
2. Manipuler des tableaux
Les tableaux sont largement employés en Java. A l’intérieur du code natif, les tableaux permettent
de fournir des fonctionnalités aux chaînes de caractères et peuvent également éviter
de manipuler explicitement des pointeurs. Afin de permettre d’utiliser les tableaux entre du code Java et du code
C/C++, un ensemble de fonctions est fourni par le JNI. On peut ainsi créer, manipuler et dimensionner des tableaux.
Création de tableaux
La possibilité de pouvoir créer de nouveaux tableaux Java depuis du code natif est parfois essentiel.
En effet, il faut savoir que la manipulation de tableaux en Java peut être certaines fois beaucoup plus lourde que
dans un langage natif. Cela s’explique en partie par le fait que les tableaux en Java occupent des espaces non contigus.
Une solution envisageable consiste à manipuler des tableaux du côté natif pour les fournir au Java
au travers du JNI.
Pour ce faire, une première catégorie de fonctions JNI permet de créer des tableaux. Celles-ci
portent toutes un nom du type NewTypeArray où Type représente
le type de tableau à créer. Seulement une fois créé, un tableau déclaré du côté
natif doit être explicitement initialisé (contrairement en Java où par défaut un tableau d’entiers
est automatiquement initialisé à 0, et à nul pour un tableau d’objets).
Manipulation de tableaux
Deux fonctions principales ont été intégrées au JNI afin de pouvoir d’une part récupérer
des tableaux d’éléments ( GetTypeArrayElements ) et d’autre part, pour propager des
modifications vers le code Java ( ReleaseTypeArrayElements ).
Exemple :
...
int i ;
int len=3;
float sum = 0;
jfloat *body = (*env)->GetFloatArrayElements(env, arr,0, len);
for (i=0; i<len; i++) { sum += body[i]; }
body[0]=sum ;
env->ReleaseFloatArrayElements(env, arr, body);
...
D’autres fonctions viennent compléter celles décrites ci-dessus, entre autre
GetArrayLength permet de connaître la taille d’un tableau Java.
Section critique
Depuis la version 1.2 de Java, de nouvelles fonctions ont aussi vu le jour. Elles fournissent de nouvelles
méthodes d’extraction des tableaux. Les deux fonctions GetPrimitiveArrayCritical() et
ReleasePrimitiveArrayCritical() permettent de récupérer avec certitude des informations
stockées dans la mémoire. Cela n’était pas garanti avec GetTypeArrayElements()
et ReleaseTypeArrayElements() car certaines fois le garbage collector nettoyait brusquement les
zone de stockage des tableaux, ce qui provoquait certaines erreurs d’exécutions dans Java 1.1.
Beaucoup d’informations existent encore sur ce sujet et le mieux consiste à se référer à la
documentation complète de JNI, consultable depuis la rubrique Télécharger.

|