2012-06-07 3 views
0

J'ai ByteBuffer directe qui devrait contenir 15 valeurs doubles créé de la manière suivanteAccès DoubleBuffer à partir du code natif

DoubleBuffer buff = ByteBuffer.allocateDirect(15*8).asDoubleBuffer(); 

d'accès I wanna ce tampon de code natif et par souci de simplicité il suffit d'écrire le nombre de 1,0 à 15,0 dedans. Du côté de la méthode java est

native public static void write(DoubleBuffer buff, int len); 

et mon code C++ est alors

JNIEXPORT void JNICALL Java_ByteBufferTest_write(JNIEnv *env, jclass cl, jobject buff, jint len) 
{ 
    double* arr = (double*) env->GetDirectBufferAddress(buff); 
    for(int i=0; i<15; i++){ 
     arr[i] = (double) i; 
    } 
} 

Appeler les éléments suivants en seulement java

write(buff, 15); 

for(int i=0; i<15; i++){ 
    System.out.println(buff.get(i)); 
} 

imprime des documents inexploitables.

La question est, est-ce que j'alloue correctement le DoubleBuffer? Serait-il préférable d'écrire

DoubleBuffer s = ByteBuffer.allocateDirect(15 * Double.SIZE/8).asDoubleBuffer(); 

ou y a-t-il encore un moyen?

La deuxième question est, pourquoi cela ne fonctionne-t-il pas? La distribution à double* dans le code JNI est-elle incorrecte?

Merci

Répondre

1

Par défaut, XxxxBuffer Java est grand endian. Si vous utilisez l'un des processeurs Intel/AMD ou ARM, il sera peu endian par défaut.

Essayez d'utiliser

DoubleBuffer buff = ByteBuffer.allocateDirect(15*8) 
           .order(ByteOrder.nativeOrder()).asDoubleBuffer(); 

BTW: L'utilisation nativeOrder() est généralement plus rapide aussi bien. ;)

Questions connexes