将c ++原始类型向量转换为java原始类型数组

时间:2014-06-05 08:01:39

标签: java c++ java-native-interface primitive

我正在为我的项目使用第三方C ++ API,它的函数的返回值类型为std::vector<int>std::vector<bool>std::vector<double>。我需要将这些类型的变量传递给Java。所以我正在使用JNI,我的函数的返回值包含jintArrayjbooleanArrayjdoubleArray类型。

我正在使用以下代码转换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;

我对这个代码块没问题。但是,如果我想对intbool类型执行此操作,则会出现以下问题:

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

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

问题在于jintjboolean的定义,因为:

typedef long            jint;
typedef unsigned char   jboolean;

jdouble

typedef double          jdouble;

正如您所看到的,我double的方便解决方案不适用于intbool类型,因为它们的typedef不匹配。

所以,我的问题是如何为所有原始类型 方便 进行此转换?

提前致谢

1 个答案:

答案 0 :(得分:2)

由于数据类型可能具有不同的大小,因此您必须复制矢量。最简单的方法是

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

当然,您可以分配jBooleanArray并在for循环中设置元素,或者为它创建一个行为类似于STL容器的包装器。