Android - NDK - C ++ - 无法初始化类型' int *'的变量。右边的jval *' jlong​​ *' (又名' long long *')

时间:2015-07-09 15:52:12

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

我问了一个关于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);

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

Java中的

longa signed 64-bit integer type。另一方面,C ++ int is only defined “保证宽度至少为16位”

让我们假设您的int是32位(这是一种非常常见的情况):所以现在你有一个指向一堆数据的指针,其中每个元素都是64位,你正在尝试将它传递给期望指向32位数据的函数。即使编译器已经允许,这显然也不会起作用。

为您提供的一些选择:

  • 更改LoadPlayerA以获取jlong*int64_t*(并更改LoadPlayerA中依赖于int类型的传入数据的任何代码。
  • 更改Java代码以将数据作为int[]而不是long[]传递,并更改LoadPlayerA以获取jint*int32_t*。< / LI>
  • 在JNI函数中分配int类型的数组/向量,并将数据从jlong转换为int,然后再将其传递给LoadPlayerA

答案 1 :(得分:0)

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