2010-03-01 2 views
4

J'ai un tableau d'entiers non signés en C et un tableau java de longs. Je veux copier le contenu des entiers non signés dans le tableau java. Jusqu'à présent, la seule fonction que j'ai trouvé pour faire ceci est SetLongArrayRegion(), mais cela prend un tableau de tampons entier. Y at-il une fonction pour définir uniquement les éléments individuels du tableau java?Copie d'une matrice C dans Java Array à l'aide de JNI

Répondre

5

Il existe également une fonction pour le type «long» primitif de définir des éléments individuels dans JNI. Donc, je crois que ce que vous voulez avoir quelque chose comme ça

unsigned int* cIntegers = getFromSomewhere(); 
int elements = sizeof(cIntegers)/sizeof(int); 

jfieldID jLongArrayId = env->GetFieldID(javaClass, "longArray", "[J"); 
jlongArray jLongArray = (jlongArray) env->GetObjectField(javaObject, jLongArrayId); 
for (unsigned int i = 0; i < elements; ++i) { 
    unsigned int cInteger = cIntegers[i]; 
    long cLong = doSomehowConvert(cInteger); 
    env->SetLongArrayElement(jLongArray, i, (jlong) cLong); 
} 

si long tableau en Java est appelé longArray et la classe java est enregistré dans une variable JClass JNI javaClass.

+0

Désolé de prendre si longtemps pour répondre à cette question. Je n'ai pas réalisé que je n'avais pas cliqué sur la case à cocher. Merci pour l'aide. – LandonSchropp

2

Il existe une fonction SetObjectArrayElement(), qui fonctionne sur les types non natifs. Si vous vouliez vraiment, vraiment utiliser cette approche, je pense que vous pourriez créer un tableau de Longs. Vous pouvez toujours avoir des problèmes avec la conversion de type.

Je pense que votre gros problème ici est que vous essayez de convertir des entiers non-signés en longs Java. Java longs sont signé 64 bits. Une fois la conversion effectuée, vous pouvez créer un tableau de type jlong ​​dans c, puis utiliser la méthode SetLongArrayRegion() pour ramener les nombres à java.