android - 将私有(private)字段添加到 android 上的 JNI 类会卡住应用程序

标签 android c++ java-native-interface

我正在开发一个使用一些 native 代码的 Android 应用程序。我让它工作,然后我做了一些更新并运行了我的测试。每次我调用 native 函数并且数据的内部链接停止时,应用程序都会卡住。

我设法将原因隔离到一行,但该行不应该产生那种影响。

std::vector<float> OrderedPointCloud;

//std::vector<float> testeatetaetart; //Problem

std::vector<float> Pose;

这很好用。

std::vector<float> OrderedPointCloud;

std::vector<float> testeatetaetart; //Problem

std::vector<float> Pose;

这会卡住并打乱链接。

我不知道这个声明会导致应用程序失败。我试过重命名它,改变类型,制作不同类型的字段并添加更多字段。没有任何影响结果。

在 C++ 的类中可以有多少个字段没有限制,字段的顺序和位置无关紧要。我没有发现冲突的命名错误,并且该字段未被使用。除非 android 有一些限制或怪癖,否则我看不出可能由此产生的问题。

我不知道是什么原因造成的,我没有收到任何错误,也不知道到哪里寻找更多信息。 任何帮助将不胜感激。

最佳答案

这称为“未定义行为”。

C++ 代码中某处的错误会导致堆或堆栈损坏。在这种情况下,程序执行并不总是立即失败。它通常会持续一段不确定的时间,因为代码不会立即尝试使用被覆盖或损坏的内存部分。但是,在稍后的某个时间点,当代码确实尝试在损坏的内存区域中取消引用指针或类似的东西时,事情就会在那个时候迅速崩溃。

例如,我可以编写一个简单的 main(),随着第一个业务订单的进行,并通过运行超过本地声明的数组的末尾来清除堆栈。我的 main() 会愉快地继续并做很多其他事情,进行计算,打印一些消息,当 main() 返回时它最终会崩溃。除了错误不在 main() 返回的位置,而是更早的位置。

您很可能就是这种情况。在您的情况下,只有在以某种特定顺序声明静态范围的对象时才会看到错误的影响,这会导致重要的静态范围的对象由于错误而在某些时候被覆盖,从而导致锁定程序。当静态作用域的对象以不同的顺序声明时,损坏的位将是代码已经使用但不再需要的位,因此看不到错误的影响。

您将需要学习如何使用任何可用的调试或静态分析工具来隔离和定位代码中的实际错误。你的问题的真正答案只有你自己能弄清楚,没有其他人能知道,因为只有你才能访问你的实际代码,你的整个代码,并且可以检查它。

欢迎使用 C++。

关于android - 将私有(private)字段添加到 android 上的 JNI 类会卡住应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34901362/

相关文章:

java - JNI EXCEPTION_ACCESS_VIOLATION (0xc0000005) msvcr100.dll+0x1ed7 仅适用于 Windows

android - 如何获取在 jni 中返回泛型类型的函数的方法 ID?

android - 可重复使用的 Activity

Android TextView 可滚动

java - 如何使用 skyepub 读取 epub 文件?

c++ - GTKMM:如何将键盘事件附加到绘图区域?

c++ - 双倍,C++中的新功能?

c++ - 重复句柄错误 : error_invalid_handle

c - Android Gradle 插件无法识别 SourceSet 'source'

android - 如何将 OpenCV 头文件包含到 C++ 项目中?