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

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

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

我收到以下错误:

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/

相关文章:

java - 跨平台 iPhone/Android 代码共享

Android - Facebook SDK 获取用户名 - Request.GraphUserCallback 返回 null

android - Picasso - 下载前缩小图像尺寸以获得更好的性能

c++ - 无法使用在模板化基类 [C++] 中声明的枚举来编译代码

android - 用于安卓 ndk 的 libutils

android - 使用 NDK C++ 中的 Renderscript 定位 Lollipop 之前的设备

安卓NDK : build after added a new library module directly under jni/folder

c# - 未找到与约束契约(Contract)名称 microsoft.visualstudio.portable library Android Portable Project 匹配的导出

c++ - 将元素数量不断变化的 map 导出为 CSV

c++ - 为函数内部的结构分配和初始化值