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