Android, NDK, JNI, "не могут инициализировать переменную типа 'long *' значением r типа 'jlong ​​*'" - PullRequest
0 голосов
/ 21 ноября 2018

Я хочу получить массив Java long[] и в конечном итоге передать его функции powerEstimate, для которой требуется ввод const long.Это определение функции в c ++:

void powerEstimate(const double rr_data[], const long timeRR_data[])

Это код, который я использую для получения массива Java long[]:

Java_com_example_matteofabris_stressmanagement_acquisition_SewAcquisition_powerEstimateNative(
    JNIEnv *env, jobject, jdoubleArray rr_j_, jlongArray timeRR_j_) {         
    // GET
    double* rr_j = env->GetDoubleArrayElements(rr_j_, NULL);
    long* timeRR_j = env->GetLongArrayElements(timeRR_j_, NULL);

    // TODO
    powerEstimate(rr_j, timeRR_j)

При сборке я получаю эту ошибку:

/Users/matteofabris/AndroidStudioProjects/StressManagement/app/src/main/cpp/native-lib.cpp:35:11: error: cannot initialize a variable of type 'long *' with an rvalue of type 'jlong *' (aka 'long long *')
long* timeRR_j = env->GetLongArrayElements(timeRR_j_, NULL);

Может кто-нибудь объяснить, почему я получаю эту ошибку и как ее решить?Заранее спасибо за терпение.

1 Ответ

0 голосов
/ 21 ноября 2018

long - это всего лишь 32 бита в Windows (которая выглядит как ваша платформа).Тем не менее, Java jlong имеет 64 бита.

Вы можете использовать __int64* в своем собственном коде вместо long, так как именно так jlong определяется в jni_md:

__int64* timeRR_j = env->GetLongArrayElements(timeRR_j_, NULL);

и

void powerEstimate(const double rr_data[], const __int64
               timeRR_data[])

Если вы не можете изменить функцию powerEstimate, вы можете переключиться на int[] на стороне Java, так как int равно 32биты, как родной long.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...