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)
我对这个代码块没问题.但是,当我想要为类型int和bool类型执行此操作时,存在以下问题:
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)
问题是定义jint和jboolean,因为:
typedef long jint;
typedef unsigned char jboolean;
Run Code Online (Sandbox Code Playgroud)
并为jdouble:
typedef double jdouble;
Run Code Online (Sandbox Code Playgroud)
因为,你可以看到我的方便解决方案double不适用于int和bool类型,因为他们的typedef不匹配.
所以,我的问题是如何方便地对所有原始类型进行这种转换?
提前致谢
由于数据类型可能具有不同的大小,因此您必须复制向量。最简单的方法是
std::vector<jboolean> tmp(data.begin(), data.end());
jboolean *outArray = &tmp[0];
Run Code Online (Sandbox Code Playgroud)
当然,您可以jBooleanArray在 for 循环中分配和设置元素,或者为其编写一个行为类似于 STL 容器的包装器。
| 归档时间: |
|
| 查看次数: |
828 次 |
| 最近记录: |