Как конвертировать Java double [] [] в C ++JNI? - PullRequest
0 голосов
/ 02 октября 2019

У меня есть двумерный 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);
    }
}

Я продолжаю получать:

неопределенная ссылка на void Clas :: Java_JNI_Call

Любые предложения о том, как это можно сделать?

1 Ответ

0 голосов
/ 02 октября 2019

Этот код генерирует функцию типа C , которая называется Java_JNI_Call:

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 ++ с помощью функции registerNatives() JNI в системах, где соглашения о вызовах C и C ++ совместимы , но вы должны использовать методы верхнего уровня или статические классы, поскольку вызов JNI не связан сC ++ объект, который можно использовать как C ++ this.

...