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



我问了一个关于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中是有符号64位整数类型。另一方面,c++ int仅定义为"保证具有至少16位的宽度"

让我们假设你的int s是32位的(这是一个非常常见的场景):所以现在你有一个指向一堆数据的指针,每个元素都是64位,你试图把它传递给一个函数,期望一个指向32位数据的指针。这显然是行不通的,即使编译器允许这样做。

给你的一些选项:

  • 更改LoadPlayerAjlong*int64_t*(并更改LoadPlayerA中依赖于传入数据类型为int的任何代码)。
  • 更改Java代码将数据作为int[]而不是long[]传递,并将LoadPlayerA更改为jint*int32_t*
  • 在JNI函数中分配一个类型为int的数组/向量,并在传递给LoadPlayerA之前将数据从jlong转换为int

感谢Michael:) ..

我是这样做的:

 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);

相关内容

最新更新