Android ndk 如何检查两个JNI阵列是否指向同一内存位置?

Android ndk 如何检查两个JNI阵列是否指向同一内存位置?,android-ndk,Android Ndk,我有两个阵列: auto inputArray = reinterpret_cast<jbyteArray>(mainEnv->NewGlobalRef(imageDataArray)); auto output = reinterpret_cast<jfloatArray>(mainEnv->NewGlobalRef(data)); 我得到了这个错误: “JNI在应用程序中检测到错误:尝试获取类型为float[]的对象的字节基元数组元素” 我猜“input

我有两个阵列:

auto inputArray = reinterpret_cast<jbyteArray>(mainEnv->NewGlobalRef(imageDataArray));
auto output = reinterpret_cast<jfloatArray>(mainEnv->NewGlobalRef(data));
我得到了这个错误:

“JNI在应用程序中检测到错误:尝试获取类型为float[]的对象的字节基元数组元素”

我猜“inputArray”(字节数组)指向“output”(浮点数组)的相同内存位置


如何检查?

您可以通过JNI
IsSameObject
函数判断两个对象引用是否指向同一个对象


错误消息告诉您正在使用
float[]
调用
GetByteArrayElements
。获取数组对象的类(使用
GetObjectClass
)将允许您在对象传递到本机代码的点查询对象的类,因此您可以确认数组具有您期望的类型。从这里,您可以缩小焦点,找出哪里出了问题。

您可以通过JNI
IsSameObject
函数判断两个对象引用是否指向同一个对象


错误消息告诉您正在使用
float[]
调用
GetByteArrayElements
。获取数组对象的类(使用
GetObjectClass
)将允许您在对象传递到本机代码的点查询对象的类,因此您可以确认数组具有您期望的类型。从这里你可以缩小你的关注范围,找出哪里出了问题。

铸造
jobject
没有什么意义,因为它不会改变底层Java对象的类型。如果您真的需要访问数据,而不是它的实际类型,那么您应该在获得本机指针后执行强制转换。我铸造它们是因为我想在本地环境中与它们一起操作。因此,“inputArray”在这两种环境中都是字节数组。我已经检查过很多次了,我都数不清了(好吧,我建议您编写一个完整的最小代码示例,用于重现此问题。如果该示例没有出现相同的问题,那么您需要确定它与实际代码的不同之处。强制转换
jobject
没有什么意义,因为它不会更改底层Java对象的类型。如果你真的需要访问数据,而不是它的实际类型。你应该在获得本机指针后执行强制转换。这些是Java中的真正类型。我强制转换它们是因为我想在本机环境中使用它们。所以“inputArray”在这两种环境中都是字节数组。我已经检查了很多次,无法再计数了。:(好吧,我建议您编写一个完整的最小代码示例,用于重现此问题。如果该示例没有出现相同的问题,那么您需要确定它与实际代码的不同之处。
auto input = env->GetByteArrayElements(inputArray, nullptr);