首页 > 解决方案 > Android NDK 应用程序中的 android.app.NativeActivity.onCreate() 异常(仅限 Android 6.0)

问题描述

我最近更新了 Android Studio 和所有 SDK 库(2019 年 6 月),突然我的一些用户在应用程序启动时开始遇到这种崩溃。

就我所见,它只发生在 Android 6.0 上。

该应用程序是一个 Android Native App,使用 NDK 和app_glue基类,编译 SDK=26。

有没有其他人经历过类似的事情?

我没有 Android 6.0 手机。我尝试创建虚拟设备,但无法在虚拟设备上复制问题。它适用于数千名其他玩家(Android 7、8、9)

这是异常调用堆栈==================================

java.lang.RuntimeException: 
  at android.app.ActivityThread.performLaunchActivity 
(ActivityThread.java:3253)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3349)
  at android.app.ActivityThread.access$1100 (ActivityThread.java:221)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1794)
  at android.os.Handler.dispatchMessage (Handler.java:102)
  at android.os.Looper.loop (Looper.java:158)
  at android.app.ActivityThread.main (ActivityThread.java:7224)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1230)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1120)

Caused by: java.lang.IllegalArgumentException: 
  at android.app.NativeActivity.onCreate (NativeActivity.java:170)
  at android.app.Activity.performCreate (Activity.java:6876)
  at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1135)
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3206)

更新:这个问题只出现在最新的Gradle 版本中: 3.4.1 当我恢复到3.2.1时,崩溃消失了。Gradle 似乎做了一些不同的事情,导致 Android 6.0 中的应用程序崩溃。

标签: androidexceptionandroid-ndknative

解决方案


如果您在5 年前的此提交NativeActivity中检查 AOSP中的实现(下一个是 3 年零 7 个月前,应该超过 6.0),您会发现第 170 行抛出:IllegalArgumentException

mNativeHandle = loadNativeCode(path, funcname, Looper.myQueue(),
        getAbsolutePath(getFilesDir()), getAbsolutePath(getObbDir()),
        getAbsolutePath(getExternalFilesDir(null)),
        Build.VERSION.SDK_INT, getAssets(), nativeSavedState);
if (mNativeHandle == 0) {
    throw new IllegalArgumentException("Unable to load native library: " + path);
}

这意味着无法找到您的本机库(或某些引用库),或者可能由于某种原因无法加载它。

我将使用 Cmd-shift-A -> "Analyze APK..." 检查是否所有本机库都存在所有架构。一个可能的问题是,由于某种原因,它被排除在某些架构之外,因此在大多数设备上都可以正常工作,但在某些情况下却失败了。


推荐阅读