Envoi int [] s entre Java et C

J'ai peu de traitement d'image de code Java dans Android qui agit sur deux grandes int tableaux. La plupart du temps, Java est assez rapide, mais j'ai besoin d'utiliser le C via JNI et le NDK pour accélérer un peu d'opérations.

La seule façon que je sais que je peux transmettre les données à partir de l'int des tableaux de C est d'utiliser ByteBuffer.allocateDirect pour créer un nouveau tampon, copiez les données et puis rendre le code C loi sur le tampon.

Cependant, je ne vois aucun moyen que je peux manipuler les données dans cette mémoire tampon en Java, comme si la mémoire tampon a un int[] ou d'un byte[]. Par exemple, un appel à ByteBuffer.array() échouera sur le nouveau tampon. Est-il possible de faire ce travail?

Je dispose de peu de mémoire et que vous souhaitez réduire la façon dont de nombreux tableaux/tampons dont j'ai besoin. Par exemple, ce serait bien si je pouvais utiliser IntBuffer.wrap(new int[...]) pour créer le tampon puis de manipuler le tableau de la sauvegarde de la mémoire tampon directement en Java, mais je ne peux pas le faire parce que la seule chose qui semble fonctionner ici pour JNI est ByteBuffer.allocateDirect.

Existe-il d'autres façons d'envoyer des données en arrière-et-vient entre le C et le Java? Je peux en quelque sorte allouer de la mémoire sur le côté C et de Java est d'envoyer des données directement là-bas?

Edit: Un test comparant l'utilisation de la mémoire tampon de type int[] utilisation:

int size = 1000;
IntBuffer allocateDirect = java.nio.ByteBuffer.allocateDirect(4 * size).asIntBuffer();
for (int i = 0; i < 100; ++i)
{
  for (int x = 0; x < size; ++x)
  {
    int v = allocateDirect.get(x);
    allocateDirect.put(x, v + 1);
  }
}

int[] intArray = new int[size];
for (int i = 0; i < 100; ++i)
{
  for (int x = 0; x < size; ++x)
  {
    int v = intArray[x];
    intArray[x] = v + 1;
  }
}

Sur un téléphone Droid, le tampon version prend environ 10 secondes pour terminer et le tableau version prend ~0.01 secondes.

source d'informationauteur rbcc