Я использую сторонний 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 не совпадают.
Итак, мой вопрос, как я могу сделать это преобразование для всех примитивных типов удобно?
заранее спасибо
Поскольку типы данных могут иметь разные размеры, вы должны скопировать вектор. Самый простой способ сделать это
std::vector<jboolean> tmp(data.begin(), data.end());
jboolean *outArray = &tmp[0];
Конечно, вы можете выделить jBooleanArray
и установите элементы в цикле for или напишите для него оболочку, которая будет вести себя как контейнер STL.