Android,NDK,JNI,“无法使用'jlong​​ *'类型的右值初始化'long *'类型的变量”

时间:2018-11-21 11:19:55

标签: java android c++ java-native-interface

我想获得一个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 :(得分:1)

long在Windows(看来是您的平台)上只有32位。但是,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函数,则可以在Java端切换到int[],因为int是32位,就像本地{{ 1}}。