如何将 Java double[][] 转换为 C++ <vector<vector>> JNI?

How to convert Java double[][] to C++ <vector<vector>> JNI?

本文关键字:lt vector gt JNI Java double 转换 C++      更新时间:2023-10-16

我有一个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_CallC类型函数:

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++对象。