преобразовать вектор примитивного типа c ++ в массив примитивных типов Java

Я использую сторонний C ++ API для своего проекта, и он имеет функции с возвращаемыми значениями с типами std::vector<int>, std::vector<bool>, std::vector<double>, Мне нужно передать переменные с этими типами в Java. Так что я использую JNI, и моя функция имеет возвращаемые значения с типами jintArray, jbooleanArray, jdoubleArray,

Я использую следующий код для преобразования double тип:

std::vector<double> data;
//fill data
jdouble *outArray = &data[0];
jdoubleArray outJNIArray = (*env).NewDoubleArray(data.size());  // allocate
if (NULL == outJNIArray) return NULL;
(*env).SetDoubleArrayRegion(outJNIArray, 0 , data.size(), outArray);  // copy
return outJNIArray;

У меня нет проблем с этим блоком кода. Но когда я хочу сделать это для int а также bool типы есть проблема в следующем:

std::vector<int> data;
//fill data
jint *outArray = &data[0];

а также

std::vector<bool> data;
//fill data
jboolean *outArray = &data[0];

Проблема с определениями jint а также jboolean, поскольку:

typedef long            jint;
typedef unsigned char   jboolean;

и для jdouble:

typedef double          jdouble;

Как вы можете видеть мое удобное решение для double не работает для int а также bool типы, так как их typedefs не совпадают.

Итак, мой вопрос, как я могу сделать это преобразование для всех примитивных типов удобно?

заранее спасибо

6

Решение

Поскольку типы данных могут иметь разные размеры, вы должны скопировать вектор. Самый простой способ сделать это

std::vector<jboolean> tmp(data.begin(), data.end());
jboolean *outArray = &tmp[0];

Конечно, вы можете выделить jBooleanArray и установите элементы в цикле for или напишите для него оболочку, которая будет вести себя как контейнер STL.

2

Другие решения


По вопросам рекламы [email protected]