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

gun*_*yim 6 c++ java primitive java-native-interface

我使用的是第三方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;
Run Code Online (Sandbox Code Playgroud)

我对这个代码块没问题.但是,当我想要为类型intbool类型执行此操作时,存在以下问题:

std::vector<int> data;
//fill data
jint *outArray = &data[0];
Run Code Online (Sandbox Code Playgroud)

std::vector<bool> data;
//fill data
jboolean *outArray = &data[0];
Run Code Online (Sandbox Code Playgroud)

问题是定义jintjboolean,因为:

typedef long            jint;
typedef unsigned char   jboolean;
Run Code Online (Sandbox Code Playgroud)

并为jdouble:

typedef double          jdouble;
Run Code Online (Sandbox Code Playgroud)

因为,你可以看到我的方便解决方案double不适用于intbool类型,因为他们的typedef不匹配.

所以,我的问题是如何方便地对所有原始类型进行这种转换?

提前致谢

Rol*_*d W 2

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

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

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