Копирование массива C в массив Java с использованием JNI - PullRequest
4 голосов
/ 01 марта 2010

У меня есть массив целых чисел без знака в C и массив длинных java. Я хочу скопировать содержимое целых чисел без знака в массив Java. Пока что единственная функция, которую я нашел, это SetLongArrayRegion (), но она занимает весь буферный массив. Есть ли функция для установки только отдельных элементов массива Java?

Ответы [ 2 ]

5 голосов
/ 03 марта 2010

Существует также функция для примитивного типа 'long' для установки отдельных элементов в JNI. Поэтому я верю, что вы хотите иметь что-то вроде этого

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);
}

если длинный массив в java называется longArray и класс java сохраняется в переменной jclass JNI javaClass.

2 голосов
/ 02 марта 2010

Существует функция SetObjectArrayElement (), которая работает с не родными типами. Если вы действительно, действительно хотите использовать этот подход, я думаю, вы могли бы создать массив Longs. У вас все еще могут быть проблемы с преобразованием типов.

Я думаю, что ваша большая проблема здесь в том, что вы пытаетесь привести беззнаковые целые числа к длинным Java. Длинные Java - это подписанные 64-битные числа. Если у вас есть правильное преобразование, вы можете создать массив типа jlong ​​в c, а затем использовать метод SetLongArrayRegion (), чтобы вернуть числа в java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...