在Android 6.0上加载protobuf-lite.so时,如何修复Android NDK应用程序崩溃和不满意的链接错误? 我创建了一个Android应用程序,它有一个依赖于谷歌的原BoLite库的自定义C++库。它在我最近尝试运行它的所有设备上都能正常工作(在安卓7、8和8.1下)。然而,我发现在运行Android 6.0.1或6.0的旧设备上(华硕Nexus 7和一些旧的摩托罗拉手机),应用程序在加载libprotobuf-lite.so依赖项时崩溃

在Android 6.0上加载protobuf-lite.so时,如何修复Android NDK应用程序崩溃和不满意的链接错误? 我创建了一个Android应用程序,它有一个依赖于谷歌的原BoLite库的自定义C++库。它在我最近尝试运行它的所有设备上都能正常工作(在安卓7、8和8.1下)。然而,我发现在运行Android 6.0.1或6.0的旧设备上(华硕Nexus 7和一些旧的摩托罗拉手机),应用程序在加载libprotobuf-lite.so依赖项时崩溃,c++,android-ndk,protocol-buffers,C++,Android Ndk,Protocol Buffers,这是我得到的stacktrace: 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

这是我得到的stacktrace:

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)
这是我的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)

以前有人遇到过这个问题吗?任何关于如何修复此问题的提示都将不胜感激。

您需要更改正在使用的NDK版本。下面的文章建议迁移到NDK 22或更新版本将解决此问题

这是我的


你的protobuf库是为比你的应用程序的其他部分更高的版本而构建的,并且不能在你正在使用的设备上运行。

事实上,回顾我的CMake缓存,我选择了ANDROID_NATIVE_API_LEVEL=28和ANDROID_PLATFORM=latest。如果我理解正确,我应该将其中一个(或两个)更改为我希望达到的最低API级别。你知道我应该更改哪一个吗?好的,不管怎样,通过查看android.toolschain.cmake文件,发现android\u NATIVE\u API\u级别已被弃用,并且与android\u平台冗余,如果设置了android\u平台,则不会使用。我将尝试重新编译我想要达到的最低API级别。我可以在安卓6设备上测试新的protobuf构建,它可以工作。我所要做的就是将ANDROID_平台设置为我想要支持的最低API级别,并使用此参数重建库。谢谢
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)