在 android 上向 JNI class 添加私有字段会冻结应用程序
Adding a private field to a JNI class on android freezes the app
我正在开发一个使用一些本机代码的 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++ 的 class 中可以有多少字段没有限制,字段的顺序和位置无关紧要。我没有发现冲突的命名错误,并且该字段未被使用。除非 android 有一些限制或怪癖,否则我看不出任何可能源于此的问题。
我不知道是什么原因导致的,我没有收到任何错误,也不知道到哪里寻找更多信息。
任何帮助将不胜感激。
这叫做"undefined behavior"。
C++ 代码中某处的错误会导致堆或堆栈损坏。在这种情况下,程序执行并不总是立即失败。它通常会持续一段不确定的时间,因为代码不会立即尝试使用被覆盖或损坏的内存部分。但是,在稍后的某个时间点,当代码确实尝试在损坏的内存区域中取消引用指针或类似的东西时,事情就会在那个时候迅速崩溃。
例如,我可以写一个简单的 main()
,随着业务的第一个订单继续进行,并在 locally-declared 数组末尾 运行 处吹走堆栈.我的 main()
会愉快地继续做很多其他事情,进行计算,打印一些消息,最终会在 main()
returns 时崩溃。除了错误不在 main()
returns 的地方,而是更早的地方。
您很可能就是这种情况。在您的情况下,只有当 statically-scoped 对象以某种特定顺序声明时才会看到错误的影响,这会导致重要的 statically-scoped 对象由于错误而在某些时候被覆盖,从而导致在一个锁定的程序中。当 statically-scoped 对象以不同的顺序声明时,损坏的位将是代码已经使用但不再需要的位,因此看不到错误的影响。
您将需要学习如何使用任何可用的调试或静态分析工具来隔离和定位代码中的实际错误。你的问题的真正答案只有你自己能弄清楚,没有其他人知道,因为只有你才能访问你的实际代码,你的整个代码,并且可以检查它。
欢迎使用 C++。
我正在开发一个使用一些本机代码的 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++ 的 class 中可以有多少字段没有限制,字段的顺序和位置无关紧要。我没有发现冲突的命名错误,并且该字段未被使用。除非 android 有一些限制或怪癖,否则我看不出任何可能源于此的问题。
我不知道是什么原因导致的,我没有收到任何错误,也不知道到哪里寻找更多信息。 任何帮助将不胜感激。
这叫做"undefined behavior"。
C++ 代码中某处的错误会导致堆或堆栈损坏。在这种情况下,程序执行并不总是立即失败。它通常会持续一段不确定的时间,因为代码不会立即尝试使用被覆盖或损坏的内存部分。但是,在稍后的某个时间点,当代码确实尝试在损坏的内存区域中取消引用指针或类似的东西时,事情就会在那个时候迅速崩溃。
例如,我可以写一个简单的 main()
,随着业务的第一个订单继续进行,并在 locally-declared 数组末尾 运行 处吹走堆栈.我的 main()
会愉快地继续做很多其他事情,进行计算,打印一些消息,最终会在 main()
returns 时崩溃。除了错误不在 main()
returns 的地方,而是更早的地方。
您很可能就是这种情况。在您的情况下,只有当 statically-scoped 对象以某种特定顺序声明时才会看到错误的影响,这会导致重要的 statically-scoped 对象由于错误而在某些时候被覆盖,从而导致在一个锁定的程序中。当 statically-scoped 对象以不同的顺序声明时,损坏的位将是代码已经使用但不再需要的位,因此看不到错误的影响。
您将需要学习如何使用任何可用的调试或静态分析工具来隔离和定位代码中的实际错误。你的问题的真正答案只有你自己能弄清楚,没有其他人知道,因为只有你才能访问你的实际代码,你的整个代码,并且可以检查它。
欢迎使用 C++。