我问了一个关于 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 .另一方面,C++ int
is only defined作为“保证具有至少 16 位的宽度”。
让我们假设您的 int
是 32 位的(这是一个非常常见的场景):所以现在您有一个指向一堆数据的指针,其中每个元素都是 64 位的,并且您正在尝试将其传递给需要指向 32 位数据的指针的函数。这显然是行不通的,即使编译器允许它也是如此。
一些给你的选项:
- 更改
LoadPlayerA
以获取jlong
或int64_t*
(并更改LoadPlayerA
中依赖于传入的数据类型为int
)。 - 更改 Java 代码以将数据作为
int[]
而不是long[]
传递,并更改LoadPlayerA
以获取一个jint*
或int32_t*
。 - 在您的 JNI 函数中分配一个
int
类型的数组/vector ,并将数据从jlong
转换为int
,然后再传递给LoadPlayerA
.
关于Android - NDK - C++ - 无法使用 'int *' 类型的右值(又名 'jlong *')初始化 'long long *' 类型的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31322468/