我正在尝试使用现有的本机库作为android项目的一部分。我按照有关将android和C ++代码添加到android studio的项目的说明。我得到了一个功能齐全的CMakeLists.txt文件(独立测试)并且我已指示gradle使用它来编译本机代码。
我使用的库使用make,所以我使用ExternalProject_Add来指示cmake如何编译它。以下是相关代码:
ExternalProject_Add(foo
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../libfoo
CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/../libfoo/configure
--host=arm-linux-androideabi
BUILD_COMMAND ${MAKE}
INSTALL_COMMAND true)
这是模块的build.gradle的相关部分:
externalNativeBuild {
cmake {
path '../cpp/CMakeLists.txt'
}
}
当我运行./gradlew assembleDebug
时,不会编译外部项目。在cmake中添加依赖于bar
的可执行文件(名为foo
)之后,配置步骤会运行,但构建步骤不会运行。我修改了库的代码,以便编译失败,但是gradle无论如何都会返回成功。)
以下是这些更改后./gradlew assembleDebug
输出的最后一行。
configure: creating ./config.status
config.status: creating Makefile
config.status: executing depfiles commands
[6/10] Performing build step for 'foo'
[7/10] Performing install step for 'foo'
[8/10] Completed 'foo'
[9/10] Building C object CMakeFiles/bar.dir/bar.c.o
[10/10] Linking C executable bar
BUILD SUCCESSFUL in 18s
任何想法发生了什么?我做错了什么?
我使用的是gradle 4.1和cmake 3.6。
答案 0 :(得分:1)
你应该使用BUILD_IN_SOURCE ON
,否则你的BINARY_DIR
就在其他地方,所以make
什么都不做恕我直言。
答案 1 :(得分:0)
见https://stackoverflow.com/a/47636956/192373。您不需要虚构的可执行文件。但是,您确实需要两个单独的目标。
add_library(foolib SHARED IMPORTED)
add_dependencies(foolib foo)
set_target_properties(foolib IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../libfoo/…/libfoo.so)
您不一定需要BUILD_IN_SOURCE ON
,最好在BINARY_DIR
的某处设置build/intermediates
,并将其传递给make
。