我从另一个Android项目生成了静态库,因此非常确定它们是否可用。
我得到了四个基于CPU架构的.a文件,其中一个.h文件也已经过测试。
现在在新项目中,另一个.c文件要调用静态库,我无法将两个项目合并,必须以.a格式调用静态库。
我收到“ CMake错误:CMake无法确定目标的链接器语言”,这是我的CMakeLists.txt:
add_library(
mylib
STATIC
src/main/jniLibs/arm64-v8a/libmylib.a
src/main/jniLibs/armeabi-v7a/libmylib.a
src/main/jniLibs/x86/libmylib.a
src/main/jniLibs/x86_64/libmylib.a
)
target_link_libraries(
native-lib
mylib
)
mylib是预构建的库。 native-lib要调用mylib。
也欢迎提供有关如何从scrath向项目添加.a文件的链接。
答案 0 :(得分:1)
您应该将现有的静态库链接到当前的共享库,即.so
。例如,您有src/c/dummy.c
。然后,您的CMakeLists.txt
应该如下所示:
add_library(my-shared-lib SHARED src/c/dummy.c)
target_link_libraries(my-shared-lib -Wl, --whole-archive src/main/jniLibs/${ANDROID_ABI}/libmylib.a -Wl,--no-whole-archive)
说明
${ANDROID_ABI}
是CMake变量,用于标识正在构建的当前ABI,即arm64-v8a
,arm64-v8a
,x86
,x86_64
。 答案 1 :(得分:0)
add_library(
my_static_lib
STATIC
IMPORTED
)
set_target_properties(features PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libmy_static_lib.a)
如您所见,我将这些.a
文件放入
projectNmae\app\src\main\jniLibs\${ANDROID_ABI}\
,
如果您更改位置,请记住在CMakeList.txt
中声明它。
我将my_static_lib.h
放在了src\main\include
中,并用在其他.c/cpp
文件中,例如:
#include "../include/features.h"
我的 BIGGEST 错误是错过的:
${CMAKE_SOURCE_DIR}
CMake无法在src/main/app/native-lib.c
之类的位置找到 STATIC 库, SHARED 库可以,而不是 STATIC 库,这非常好
导入是必须的,我尝试将其替换为整个位置路径,将无法正常工作。
感谢所有评论和答案,我希望这个答案可以帮助像我这样的新手。