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

时间:2016-01-20 13:27:38

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

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

我设法将原因分解为单行,但该行不应该有这种效果。

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上有一些限制或怪癖,否则我认为没有可能出现的问题。

我不知道是什么导致这种情况,我没有错误,我不知道在哪里寻找更多信息。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

这称为“未定义行为”。

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

例如,我可以编写一个简单的main(),当业务的第一顺序继续运行并通过运行本地声明的数组的末尾来吹掉堆栈。我的main()会愉快地继续进行并做其他一些事情,进行计算,打印一些消息,并且当main()返回时它最终会崩溃。除了错误不在main()返回的地方,但更早,更早。

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

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

欢迎使用C ++。