Android - NDK - C++ - 无法使用 'jlong *' 类型的右值(又名 'long long *')初始化 'int *' 类型的变量

Android - NDK - C++ - cannot initialize a variable of type 'int *' with an rvalue of type 'jlong *' (aka 'long long *')

我问了一个关于 char to jsstring 的类似问题......但现在我遇到了 int to jlongArray 的问题,我无法弄清楚:/

我收到以下错误:

Error:(290, 10) error: cannot initialize a variable of type 'int *' with an rvalue of type 'jlong *' (aka 'long long *')

这一行:

JNIEXPORT void Java_de_meetspot_ndktest_MainActivity_LoadPlayerA(JNIEnv *javaEnvironment, jobject self, jstring audioPath, jlongArray offsetAndLength) {
   const char* audio = javaEnvironment->GetStringUTFChars(audioPath, JNI_FALSE);
   int* params = javaEnvironment->GetLongArrayElements(offsetAndLength, JNI_FALSE);
   example->LoadPlayerA(audio, params);
}

这是声明:

void LoadPlayerA(const char *audioPath, int *params);

有人可以帮我吗?

long 在 Java 中是 a signed 64-bit integer type. A C++ int on the other hand is only defined 作为 "guaranteed to have a width of at least 16 bits".

让我们假设您的 int 是 32 位的(这是一个非常常见的场景):所以现在您有一个指向一堆数据的指针,其中每个元素都是 64 位,并且您重新尝试将其传递给需要指向 32 位数据的指针的函数。这显然是行不通的,即使编译器允许它。

您的一些选择:

  • 更改 LoadPlayerA 以采用 jlong*int64_t*(并更改 LoadPlayerA 中依赖于 int 类型的传入数据的任何代码).
  • 更改 Java 代码以将数据作为 int[] 而不是 long[] 传递,并更改 LoadPlayerA 以采用 jint*int32_t*.
  • 在您的 JNI 函数中分配类型为 int 的 array/vector 并将数据从 jlong 转换为 int,然后再传递给 LoadPlayerA

感谢迈克尔 :) ..

我是这样做的:

 jlong *longParams = javaEnvironment->GetLongArrayElements(params, JNI_FALSE);
   int arr[6];
   for (int n = 0; n < 6; n++) arr[n] = longParams[n];
   javaEnvironment->ReleaseLongArrayElements(params, longParams, JNI_ABORT);