我正在研究使用 NDK 9 为 Android 5 或更高版本编译 native 代码时是否存在任何问题,但尚未找到任何答案。 我已经在 source.android.com 中进行了长时间的搜索,this页面是我离回答越近,但还不清楚......
我问这个是因为我在用 C 编写的要放入我的 Android 应用程序的 native 代码中遇到 SIGSEGV
问题。在 Android 5 之前,代码运行流畅,但在每台使用 Android 5 或更高版本的设备中偶尔会出现此错误(有时代码运行无误)。
最佳答案
对于NDK版本,应该没问题。这是一个较旧的年份,但应该仍然 正确构建您的代码。不过,我会尽快尝试更新,只是为了 保持现状。我认为这不是崩溃的原因。
引入 Android 5 the Android Runtime (ART)默认情况下。在此之前 使用的虚拟机是 Dalvik .我发现 Android 5 中的 JNI 层是一个 严格很多。在旧的 Dalvik 世界中,你通常可以逃脱惩罚,因为 例如,在 JNI 调用之间共享一个 JNIEnv 指针。在 ART 中这不是 可能并且总是会崩溃。只是要清楚,在 Dalvik 中它不应该工作 要么,但你可以侥幸逃脱,所以错误没有被发现。
另一件需要注意的事情是创建大的局部变量,比如 数组,在栈上。在 Dalvik 中,每个线程有 2 个栈,一个用于 JNI 代码,另一个 一个用于 Java,但在 ART 中,堆栈在 native 和 Java 之间共享。所以 JNI 代码可能会用完堆栈并崩溃。这些类型的崩溃可以 很难追踪到。代码检查寻找本地 (非 malloc'd)数组是我过去发现的一些方法。
是否有来自 logcat 的良好堆栈跟踪?通常您可以通过以下方式调试 SIGSEGV
在调试中构建并通过 ndk-stack
传递堆栈跟踪.
如果幸运的话,它会为您提供代码崩溃的行。
关于android - 使用 NDK 9 为 Android 5.0 或更高版本构建的应用程序之间是否存在不兼容性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41827814/