我正在为我的项目使用第三方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
类型,因为它们的typedef不匹配。
所以,我的问题是如何为所有原始类型 方便 进行此转换?
提前致谢
答案 0 :(得分:2)
由于数据类型可能具有不同的大小,因此您必须复制矢量。最简单的方法是
std::vector<jboolean> tmp(data.begin(), data.end());
jboolean *outArray = &tmp[0];
当然,您可以分配jBooleanArray
并在for循环中设置元素,或者为它创建一个行为类似于STL容器的包装器。