gpt4 book ai didi

java - 如何将 Java double[][] 转换为 C++ > JNI?

转载 作者:行者123 更新时间:2023-12-01 23:57:08 24 4
gpt4 key购买 nike

我有一个 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);
}
}

我不断得到:

undefined reference to void Clas::Java_JNI_Call

关于如何做到这一点有什么建议吗?

最佳答案

此代码生成一个名为 Java_JNI_CallC 类型函数:

extern "C"
JNIEXPORT void JNICALL
Java_JNI_Call(JNIEnv *env, jobject thiz, jobjectArray jdestination_list,)

C 类型函数 ( note the extern "C"... ) 不是任何类的成员,它不能被重载,并且函数名称不经过 name mangling就像 C++ 函数一样。

此错误消息提示您没有提供 C++ 函数的定义 Clas::Java_JNI_Call:

undefined reference to void Clas::Java_JNI_Call

因为你还没有。

从技术上讲,JNI 调用是 C 函数,而不是 C++ 函数。您可以通过 systems where C and C++ calling conventions are compatible 上的 JNI 的 registerNatives() 函数来使用 C++ 函数。 ,但您必须使用顶级或静态类方法,因为 JNI 调用没有可用作 C++ this 的关联 C++ 对象。

关于java - 如何将 Java double[][] 转换为 C++ <vector<vector>> JNI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58196437/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com