我有一个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的未定义引用
关于如何做到这一点的任何建议?
答案 0 :(得分:0)
此代码生成名为Java_JNI_Call
的 C 类型的函数:
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 ++对象可以用作C ++ this
。