Voici une solution possible compte tenu des petites informations que vous avez fournies.
Du côté Java des choses, vous auriez:
package com.stackoverflow;
public class JNIQuestion
{
static native void fillByteArray(byte[] buffer);
}
Et du côté C vous auriez:
JNIEXPORT void JNICALL Java_com_stackoverflow_JNIQuestion_fillByteArray(JNIEnv* env, jbyteArray array)
{
jboolean isCopy;
jbyte* buffer = (*env)->GetByteArrayElements(env, array, &isCopy);
jsize length = (*env)->GetArrayLength(env, array);
jsize i;
// do something with the buffer here, replace with something meaningful
// PAY ATTENTION TO BUFFER OVERFLOW, DO NOT WRITE BEYOND BUFFER LENGTH
for (i = 0; i < length; ++i)
buffer[i] = i;
// here it is important to use 0 so that JNI takes care of copying
// the data back to the Java side in case GetByteArrayElements returned a copy
(*env)->ReleaseByteArrayElements(env, buffer, 0);
}
En utilisant une ByteBuffer
directe (ByteBuffer.allocateDirect()
) est aussi une solution possible . Cependant, je n'utilise qu'un ByteBuffer
direct lorsque j'ai besoin de remplir des données du côté Java d'un décalage très précis dans le tampon. A propos des performances, la solution utilisant un byte[]
devrait être satisfaisante car la machine virtuelle Java est susceptible d'épingler la matrice d'octets au lieu de la copier lors de l'appel GetByteArrayElements()
.
De manière générale, vous souhaiterez minimiser le nombre d'appels JNI, ce qui implique que l'accès aux champs d'objet du côté C ou l'allocation de Java du côté C aura un impact sur les performances.
Dans tous les cas, profil d'abord, optimisez ensuite. PS: Je n'ai pas essayé de compiler le code, il pourrait y avoir des fautes de frappe. Reportez-vous aux JNI Guide et JNI Tutorial.
donnez svp au moins la signature de votre méthode native en Java pour que quelqu'un puisse trouver une solution raisonnable –
@Gregory: Il suffit de prendre un objet comme paramètre ... Accéder au champ n'est pas le problème, assigner un pointeur ou copier des données dans le champ byte [] est. – John
Qu'est-ce qu'un problème? est-ce un problème de performance ou vous ne réussissez pas à remplir les données? –