【问题标题】:application get crash because of ABI filters in android由于 android 中的 ABI 过滤器,应用程序崩溃
【发布时间】:2018-02-14 18:33:50
【问题描述】:

我正在使用vitamio 播放视频和音频,因为我使用了如下所示的 gradle 配置

 ndk {
               abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
        }

它在所有安卓版本上都能完美运行。

现在我使用 CMaker tutorial 添加了 JNI 代码以进行某些操作,但应用程序在 android 版本 7 上崩溃,只有以下日志

 Build fingerprint: 'xiaomi/mido/mido:7.0/NRD90M/V8.5.4.0.NCFMIED:user/release-keys'
 Revision: '0'
 ABI: 'arm'
 pid: 27944, tid: 28106, name: SyncAdapterThre  >>> com.mypackage <<<
 signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x29c
     r0 e4685300  r1 00000000  r2 074edc1e  r3 000004a1
     r4 00000000  r5 0000001a  r6 cf6b6740  r7 c63fecf0
     r8 c63feca8  r9 00000020  sl c63fecc8  fp 4ec4ec4f
     ip 2280b031  sp c63feca8  lr ec409776  pc cf6b6712  cpsr 60010030

在更改 NDK 配置后,如下所示

 ndk {
        abiFilters "arm64-v8a","armeabi", "armeabi-v7a", "x86","x86_64", "mips"
           }

但现在只有以下日志在 android 版本 7 上出现 vitamio 崩溃

Build fingerprint: 'xiaomi/mido/mido:7.0/NRD90M/V8.5.4.0.NCFMIED:user/release-keys'
 Revision: '0'
 ABI: 'arm64'
 pid: 30859, tid: 30859, name: .onlineradioapp  >>> com.mypackage <<<
 signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
     x0   00000000000017a8  x1   0000000000000000  x2   0000007f6c200000  x3   0000000000000002
     x4   00000000000001a1  x5   0000000000008080  x6   0000007fa5c62000  x7   0000000000000000
     x8   0000000000000000  x9   0000007fa1e0c688  x10  00000000000001a1  x11  0000000000000000
     x12  0000000000000018  x13  0000000000000000  x14  0000000000000000  x15  00326d4469b4dcca
     x16  0000007fa26625a0  x17  0000007fa26098a8  x18  00000000ffffffff  x19  0000007fe80b04e0
     x20  0000007f798baa90  x21  0000007f6c3a1480  x22  0000007f798da000  x23  0000007f798da000
     x24  0000007f798ba000  x25  0000000000000000  x26  0000000000200021  x27  56c8e96642a3fb3d
     x28  0000000000000001  x29  0000007fe80b0480  x30  0000007f798b344c
     sp   0000007fe80b0480  pc   0000000000000000  pstate 0000000020000000

ABI 存在问题,在 vitamio 中没有可用于 ABI: 'arm64' 的实现,谁能帮我解决这个问题

谢谢

【问题讨论】:

  • 查看包名,与jni一致
  • @KongJing 你能详细解释一下吗?我提到它使用不同的apiFilter 如果我设置arm64-v8a 然后加载JNI 库但没有加载vitamio 文件,如果我删除arm64-v8a 然后JNI 停止加载,vitamio 开始加载
  • 我理解包名不一致,如果有请删除ndk { abiFilters "armeabi", "armeabi-v7a", "x86", "mips" }
  • 尽量只留下一个ABI,armeabi-v7a。检查 APK 的内容 - 它的库应该包含所有必要的文件。
  • 同意@AlexCohn

标签: android android-ndk java-native-interface vitamio


【解决方案1】:

hello-jni.c

Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv *env,jobject thiz)

HelloJni.java

package com.example.hellojni;

static {
        System.loadLibrary("hello-jni");
    }

public native String  stringFromJNI();

我明白包裹不一样的原因

【讨论】:

  • 包是一样的,没有问题
  • delete ndk { abiFilters "armeabi", "armeabi-v7a", "x86", "mips" },能解决这个问题吗?
  • 在这种情况下 vitamio 会崩溃,因为默认情况下它会为所有 ABI 版本构建 .so 文件,并且所有 ABI 版本都没有实现
  • 它们是否可以让我们的 JNI 在("armeabi", "armeabi-v7a", "x86", "mips") 中加载 .so 文件
  • 如果 s 不是有效的以零结尾的 modified utf8 字符串,NewStringUTF(s) 可能会崩溃。
猜你喜欢
  • 2021-04-20
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多