在 android 上向 JNI 类添加私有字段会冻结应用程序

Adding a private field to a JNI class on android freezes the app

本文关键字:字段 冻结 应用程序 添加 android 上向 JNI      更新时间:2023-10-16

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

我设法将原因隔离到一条线,但这条线不应该有这种效果。

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()返回的点,而是更早。

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

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

欢迎来到C++。