java - 应用程序使用 Canvas 上的矩阵计算使 native 代码中的 Android 4.3+ 崩溃

标签 java android android-canvas android-4.3-jelly-bean

在您花更多时间阅读本文之前:我将亲自回答这个问题。我花了一整天的时间对此进行调试,并认为我应该分享。

我是一个应用程序的开发者,该应用程序基本上是一种高尔夫球场的逐向导航。因此,我有一些图像需要旋转才能使图像朝北。这显然需要一些矩阵变换。

在 Android 4.3 被推送到 HTC One 之后,我收到了一些提示,说只要有人想使用它,应用程序就会简单地关闭。 “可惜停了。”

我的初始调试 session 没有清除任何东西。没有异常被抛出,所以一开始没有什么可以通过的。我在日志中发现了以下内容:

11-12 14:12:56.257: ASSERT/libc(5206): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 5206 (ndroid.appname)

由于没有真正开始调试的地方,我在很长一段时间内都采用老式的方式逐步检查所有内容,确定可能的嫌疑人和大量咖啡因,但最终我在一位编写了结果证明是罪魁祸首的代码。

最佳答案

事实证明,这一行导致了所有问题: canvas.setMatrix(null);

这行代码的目的很简单:将转换矩阵重置回单位矩阵,以便可以应用新的转换。根据the documentation ,这是允许的:

Completely replace the current matrix with the specified matrix. If the matrix parameter is null, then the current matrix is reset to identity.

显然,从事 Android 工作的人员从 4.3 代码中删除了对空参数的检查,但认为没有必要更新文档抛出一个像样的异常。相反,这条线只会让所有东西崩溃,而对它发生的位置和原因一无所知。

我已经提交了 bug report如果有人感兴趣。我希望它或这个线程能帮助处于相同情况的人。

关于java - 应用程序使用 Canvas 上的矩阵计算使 native 代码中的 Android 4.3+ 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20022243/

相关文章:

java - 如何确定用于绘制折线图的一系列数字的正确域?

java - for 和 if 语句中的空指针异常

java - Spring Boot Actuator - 如何向/关闭端点添加自定义逻辑

java - 为什么我总是回复 1011 而不是 1101?

android - 使用 Android Studio 2.0 (Beta 2) 逐步调试 NDK

android - Android中的全屏DialogFragment

安卓绘图填充工具

java - Canvas 如何确定其裁剪范围?

安卓 WebView : Mailto Unable to Implement

android - 使用 Android 的 Canvas 中两条路径之间的交集