在 android 上向 JNI 类添加私有字段会冻结应用程序
Adding a private field to a JNI class on android freezes the app
我正在开发一个使用一些本机代码的安卓应用程序。我让它工作,然后我做了一些更新并运行了我的测试。每次我调用本机函数时,应用程序都会冻结,并且数据的内部链接停止。
我设法将原因隔离到一条线,但这条线不应该有这种效果。
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++。
- 将结构字段的类型展开为可变模板参数
- 将位字段导出到数组
- 为了方便起见,我应该避免公开私有字段变量吗
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 在java中读取c++字节的位字段
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 私有字段对象与私有继承?
- 声明没有默认构造函数的字段
- C++内存模型和位字段的最大序列
- 声明为无效的变量或字段'...' Ardunio 编译器上的错误
- 如何在QByteArray中放置和检索位字段而不会感到痛苦?
- C++ win32 如何使密码字段可选并启用复制和粘贴?
- 如何通过UDP接收QByteArray并将其解析为位字段结构?
- 仅匹配集合中的某些字段
- 结构字段名称与 GDB 中的 STL 数组冲突
- 如何使用位字段将数据从二进制文件复制到结构中?
- 结构体和类的不同大小(),彼此具有相同的字段类型
- 如何避免在数据结构中包含存储为字段的类?
- 聚合初始化和删除的复制构造函数,也称为不可复制的 obejcts 作为字段
- 在 android 上向 JNI 类添加私有字段会冻结应用程序