android - 使用 NDK 9 为 Android 5.0 或更高版本构建的应用程序之间是否存在不兼容性?

标签 android android-ndk

我正在研究使用 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/

相关文章:

android - 如何在 Android 中使用 Flickr 身份验证?

android - NDK 使用什么标志来发布 lib

android - 如何创建 NDK AMediaMuxer?

java - Android - 使用 LongClickListener 而不是 OnTouch 进​​行拖动?

java - 支持多国语言

安卓 NDK java.lang.UnsatisfiedLinkError : findLibrary returned null when Multidex enabled

java - 从 JNI 中编码数据的最快方法是什么

android - 如何在 native Activity 中使用共享库

android - 如何在 Unity3d 中指定 Android SDK 版本?

android - 恢复 Android 状态时崩溃 - 无法转换 AbsSavedState