gpt4 book ai didi

c++ - 在 Android 6.0 上加载 protobuf-lite.so 时,如何修复 Android NDK 应用程序因 UnsatisfiedLinkError 崩溃?

转载 作者:行者123 更新时间:2023-11-30 04:49:19 26 4
gpt4 key购买 nike

我已经使用依赖于 Google 的 protobuf-lite 库的自定义 C++ 库创建了一个 Android 应用程序。它在我尝试运行它的所有最新设备(在 Android 7、8 和 8.1 下)上运行良好。但是,我发现在运行 Android 6.0.1 或 6.0 的旧设备(Asus Nexus 7 和一些旧的摩托罗拉手机)上,应用程序在加载 libprotobuf-lite.so 依赖项时崩溃。

这是我得到的堆栈跟踪:

E/AndroidRuntime: FATAL EXCEPTION:
main Process: com.mycompany.core, PID: 11582 java.lang.UnsatisfiedLinkError:
dlopen failed: cannot locate symbol "__aeabi_memmove8" referenced by "/data/app/com.mycompany.core-2/lib/arm/libprotobuf-lite.so"...
at java.lang.Runtime.loadLibrary(Runtime.java:372)
at java.lang.System.loadLibrary(System.java:1076)
at com.mycompany.core.CameraTestActivity.<clinit>(CameraTestActivity.java:46)
at java.lang.Class.newInstance(Native Method)
at android.app.Instrumentation.newActivity(Instrumentation.java:1067)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2317)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)$
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

这真的很奇怪,因为缺少的符号“__aeabi_memmove8”似乎是一个低级标准库功能,我不太明白为什么在 Android 6 上找不到它。

此外,我非常确信问题出在 protobuf-lite 未正确链接,因为我的应用程序的先前版本(未使用 protobuf)在这些 Android 6 设备上运行良好。

下面是我的配置的一些细节。

  • Protobuf 版本:3.6.1
  • 使用 Cmake GUI、NDK r18 工具链和 MinGW 从源代码交叉编译的 Lib 包
  • 设备的 ABI:armeabi-v7a
  • Android SDK编译版本:API 28
  • 应用构建工具链:Gradle + CMake。
  • Android Studio 3.1.3

这是我的 build.gradle 文件:

android {
compileSdkVersion 28
defaultConfig {
applicationId "com.mycompany.core"
minSdkVersion 21
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags "-frtti -fexceptions"
}
}
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

ndk{
abiFilters "arm64-v8a", "armeabi-v7a"
}
}

debug {
ndk{
abiFilters "arm64-v8a", "armeabi-v7a"
}
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation "android.arch.lifecycle:extensions:1.1.0"
implementation "android.arch.lifecycle:viewmodel:1.1.0"
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

这是我的 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.4.1)

include_directories(src/main/cpp/protobuf/include)

file(GLOB SRCS
"src/main/cpp/core/*.cpp"
)

file(GLOB JNI_SRCS
"src/main/cpp/jni/*.cpp"
)

add_library(mycorelib SHARED ${SRCS} ${JNI_SRCS})

find_library(log-lib log)

add_library(libprotobuf-lite SHARED IMPORTED)

set_target_properties(libprotobuf-lite
PROPERTIES IMPORTED_LOCATION
${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libprotobuf-lite.so)

target_link_libraries(mycorelib
android
jnigraphics
${log-lib}
libprotobuf-lite)

有没有人遇到过这个问题?将不胜感激有关如何解决此问题的任何提示。

最佳答案

这是 https://android.googlesource.com/platform/ndk/+/master/docs/user/common_problems.md#cannot-locate-symbols .

您的 protobuf 库是为比您应用的其余部分更高的 minSdkVersion 构建的,并且无法在您使用的设备上运行。

关于c++ - 在 Android 6.0 上加载 protobuf-lite.so 时,如何修复 Android NDK 应用程序因 UnsatisfiedLinkError 崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55458241/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com