如何将 Java double[][] 转换为 C++ <vector<vector>> JNI?
How to convert Java double[][] to C++ <vector<vector>> JNI?
我有一个2D Java双数组:
double[][] jdestination_list = new double[][];
如何将其转换为:
vector<vector<double>> destinationListCpp;
我的 JNI 调用如下:
extern "C"
JNIEXPORT void JNICALL
Java_JNI_Call(JNIEnv *env, jobject thiz, jobjectArray jdestination_list,)
// always on the lookout for null pointers. Everything we get from Java
// can be null.
jsize OuterDim = jdestination_list ? env->GetArrayLength(jdestination_list) : 0;
std::vector<std::vector<double> > destinationListCpp(OuterDim);
for(jsize i = 0; i < OuterDim; ++i) {
jdoubleArray inner = static_cast<jdoubleArray>(env->GetObjectArrayElement(jdestination_list, i));
// again: null pointer check
if(inner) {
// Get the inner array length here. It needn't be the same for all
// inner arrays.
jsize InnerDim = env->GetArrayLength(inner);
destinationListCpp[i].resize(InnerDim);
jdouble *data = env->GetDoubleArrayElements(inner, 0);
std::copy(data, data + InnerDim, destinationListCpp[i].begin());
env->ReleaseDoubleArrayElements(inner, data, 0);
}
}
我一直得到:
对无效 Clas::Java_JNI_Call 的未定义引用
关于如何做到这一点的任何建议?
此代码生成一个名为Java_JNI_Call
的C类型函数:
extern "C"
JNIEXPORT void JNICALL
Java_JNI_Call(JNIEnv *env, jobject thiz, jobjectArray jdestination_list,)
该 C类型函数(注意extern "C"
...(不是任何类的成员,它不能重载,并且函数名称不会像C++函数那样进行名称重整。
此错误消息抱怨您没有提供C++函数的定义Clas::Java_JNI_Call
:
undefined reference to void Clas::Java_JNI_Call
因为你没有。
从技术上讲,JNI 调用是C函数,而不是C++函数。 在 C 和 C++ 调用约定兼容的系统上,您可以通过 JNI 的registerNatives()
函数使用C++函数,但您必须使用顶级或静态类方法,因为 JNI 调用没有可用作C++this
的关联C++对象。
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中用vector填充一个简单的动态数组
- vector.resize()中的分配错误
- 使用std::vector的OpenCL矩阵乘法
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 在某些循环内使用vector.push_back时出现分段错误
- 当vector是tje全局变量时,c++中vector的内存管理
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- std::vector的包装器,使数组的结构看起来像结构的数组
- 呼叫运营商<<临时
- 为什么(-1)%vector::size()总是返回0
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 在C++中将类(带有Vector成员)保存为二进制文件
- 编译器如何区分std::vector的构造函数
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- std::vector::reserve(未知m),我知道m<<;N(通常)并且知道N
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- C++重载<<具有typedef'd std::vector
- std::映射<>或std::vector<>在处理大型标志集时