【发布时间】:2021-01-17 19:47:44
【问题描述】:
我的项目在更新 gradle 后停止工作。 我通过 JNI 在 Android 中使用 C 库。 使用 Cmake 编译和加入库 之前编译链接没有问题,现在编译项目时链接时出错。
它抛出这个错误:
/home/my_user/Documents/Proyects/optandroid/app/src/main/cpp/kotlin-jni.c:152: error: undefined reference to 'find_best_order'
这是 android studio 在尝试构建项目后也给出的扩展错误消息:
> Task :app:externalNativeBuildDebug FAILED
Build multiple targets main_armeabi-v7a this_library_armeabi-v7a process_control_armeabi-v7a
ninja: Entering directory `/home/my_user/Documents/Proyects/optandroid/app/.cxx/cmake/debug/armeabi-v7a'
[1/1] Linking C shared library /home/my_user/Documents/Proyects/optandroid/app/build/intermediates/cmake/debug/obj/armeabi-v7a/libthis_library.so
FAILED: /home/my_user/Documents/Proyects/optandroid/app/build/intermediates/cmake/debug/obj/armeabi-v7a/libthis_library.so
: && /home/my_user/Android/Sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=armv7-none-linux-androideabi19 --gcc-toolchain=/home/my_user/Android/Sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64 --sysroot=/home/my_user/Android/Sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -O0 -fno-limit-debug-info -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--fatal-warnings -Wl,--exclude-libs,libunwind.a -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,libthis_library.so -o /home/my_user/Documents/Proyects/optandroid/app/build/intermediates/cmake/debug/obj/armeabi-v7a/libthis_library.so CMakeFiles/this_library.dir/kotlin-jni.c.o used_library/src/libmodule_used_library.a /home/my_user/Documents/Proyects/optandroid/app/build/intermediates/cmake/debug/obj/armeabi-v7a/libprocess_control.so -latomic -lm && :
/home/my_user/Android/Sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: error: used_library/src/libmodule_used_library.a: member at 3324 is not an ELF object
/home/my_user/Documents/Proyects/optandroid/app/src/main/cpp/kotlin-jni.c:152: error: undefined reference to 'find_best_order'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
Execution failed for task ':app:externalNativeBuildDebug'.
> Build command failed.
Error while executing process ninja with arguments {-C /home/my_user/Documents/Proyects/optandroid/app/.cxx/cmake/debug/armeabi-v7a main this_library process_control}
ninja: Entering directory `/home/my_user/Documents/Proyects/optandroid/app/.cxx/cmake/debug/armeabi-v7a'
[1/1] Linking C shared library /home/my_user/Documents/Proyects/optandroid/app/build/intermediates/cmake/debug/obj/armeabi-v7a/libthis_library.so
FAILED: /home/my_user/Documents/Proyects/optandroid/app/build/intermediates/cmake/debug/obj/armeabi-v7a/libthis_library.so
: && /home/my_user/Android/Sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=armv7-none-linux-androideabi19 --gcc-toolchain=/home/my_user/Android/Sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64 --sysroot=/home/my_user/Android/Sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -O0 -fno-limit-debug-info -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--fatal-warnings -Wl,--exclude-libs,libunwind.a -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,libthis_library.so -o /home/my_user/Documents/Proyects/optandroid/app/build/intermediates/cmake/debug/obj/armeabi-v7a/libthis_library.so CMakeFiles/this_library.dir/kotlin-jni.c.o used_library/src/libmodule_used_library.a /home/my_user/Documents/Proyects/optandroid/app/build/intermediates/cmake/debug/obj/armeabi-v7a/libprocess_control.so -latomic -lm && :
/home/my_user/Android/Sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: error: used_library/src/libmodule_used_library.a: member at 3324 is not an ELF object
/home/my_user/Documents/Proyects/optandroid/app/src/main/cpp/kotlin-jni.c:152: error: undefined reference to 'find_best_order'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
这是 CmakeLists.txt:
cmake_minimum_required(VERSION 3.15)
project(Optandroid)
set(CMAKE_C_STANDARD 99)
add_subdirectory(used_library)
add_library(this_library
SHARED
kotlin-jni.c
)
# Include libraries needed for kotlin-jni lib
target_link_libraries(this_library
process_library
android
log)
used_library是库目录,它构建库process_library,this_library是我用于JNI的。
这是一个纯C项目,和C++无关,所以不是C++改函数名的问题。
我证实问题是从更新项目中的 gradle 开始的,方法是采用一个以完全相同的方式使用该库的旧项目,然后进行更新,它之前可以工作,但之后会出现完全相同的错误。
提前致谢。
【问题讨论】:
标签: android c gradle cmake linker