Ho un codice Java di elaborazione immagini in Android che agisce su due grandi array int. La maggior parte delle volte, Java è abbastanza veloce ma ho bisogno di usare C tramite JNI e NDK per velocizzare alcune operazioni.Invio di int [] s tra Java e C
L'unico modo per sapere che posso passare i dati dalle int arrays a C è utilizzare ByteBuffer.allocateDirect per creare un nuovo buffer, copiare i dati su quello e quindi fare in modo che il codice C agisca sul buffer.
Tuttavia, non riesco a vedere alcun modo per manipolare i dati in questo buffer in Java come se il buffer fosse un int [] o un byte []. Ad esempio, una chiamata a ByteBuffer.array() non riuscirà nel buffer appena creato. C'è un modo per farlo funzionare?
Ho una memoria limitata e voglio ridurre il numero di matrici/buffer di cui ho bisogno. Ad esempio, sarebbe bello se potessi usare IntBuffer.wrap (new int [...]) per creare il buffer e quindi manipolare l'array che supporta il buffer direttamente in Java, ma non posso farlo perché l'unica cosa che sembra lavoro qui per JNI è ByteBuffer.allocateDirect.
Esistono altri modi per inviare dati avanti e indietro tra C e Java? Posso in qualche modo allocare memoria sul lato C e avere Java inviare i dati direttamente lì?
Edit: Un punto di riferimento a confronto l'uso di buffer a int [] Uso:
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;
}
}
Su un telefono Droid, la versione di buffer richiede circa 10 secondi per terminare e la versione di serie prende ~ 0.01 secondi.
Aspetta, cosa c'è di sbagliato con [ 'ByteBuffer.asIntBuffer'] (http://developer.android.com/reference/java/nio/ByteBuffer.html#asIntBuffer%28%29)? Hai davvero bisogno di avere un 'int []'? – ephemient
... e inoltre, puoi chiamare .array() su IntBuffer se lo desideri. – mpontillo
.array() genera un'eccezione non supportata sia per ByteBuffer che per IntBuffer per gli array allocati direttamente in Java. Voglio davvero accedere a un int [] in modo da poter eseguire alcuni dei processi di elaborazione delle immagini meno intensi in Java, ad es. convertire un'immagine in bianco e nero controllando quali pixel sono sopra/sotto una soglia di luminosità. L'utilizzo di IntBuffer get/put per ogni pixel sarebbe troppo lento in Android oltre ad essere goffo. – rbcc