在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依赖项时崩溃
这是我得到的stacktrace:在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
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)