在您花更多时间阅读本文之前:我将亲自回答这个问题。我花了一整天的时间对此进行调试,并认为我应该分享。
我是一个应用程序的开发者,该应用程序基本上是一种高尔夫球场的逐向导航。因此,我有一些图像需要旋转才能使图像朝北。这显然需要一些矩阵变换。
在 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/