现在,我在Android Studio 3.2中创建了一个包含c ++支持的新项目,它看起来native-lib.cpp
自然CMakeLists.txt
是这样的:
add_library( # Sets the name of the library.
native-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/cpp/native-lib.cpp)
现在,如果我构建此项目,则可以libnative-lib.so
在某些“调试”目录中找到,这是可以的,但是我需要静态库,即.a
文件。
更改SHARED到STATIC不会产生这些文件,我应该做什么?
CMake文档仅提及以外的方法add_library()
。
我搜索的每个文档都只谈论SHARED/STATIC
。
我错过了什么?
首先,我要感谢上面的所有人,没有您的灵感,我无法得到这个答案。
我写下这个答案不是为了避免那些答案是错误的,我只是想一步一步地帮助像我这样的新手,所有细节都应该知道。
这个答案在带有CMake 3.4.1的Android Studio 3.2.1中得到了证明,我进行了三重检查。
现在,如果您创建一个具有C ++支持的新项目,请始终单击“下一步”,您将获得一个CMakeLists.txt
,外观应如下所示:
cmake_minimum_required(VERSION 3.4.1)
add_library(
native-lib
SHARED
src/main/cpp/native-lib.cpp)
find_library(
log-lib
log)
target_link_libraries(
native-lib
${log-lib})
将SHARED更改为STATIC将不会输出任何.a
文件,您将一无所获,甚至没有.so
文件(当然,此文件中没有添加SHARED库)。
这是Gradle / Android Studio的“故障”,上面的答案已经提到了这一点,如果单独使用CMake,则将定义.a
文件。
好,现在是我的绝招:
我们已经有一个添加SHARED库,然后添加一个使用相同源文件的STATIC库。在下面添加CMakeLists.txt
:
add_library(
native-lib-static
STATIC
src/main/cpp/native-lib.cpp
)
因为“ native-lib-static”用于共享版本,所以可以用“ native-lib”以外的任何名称替换。
target_link_libraries
像这样更改您的:
target_link_libraries(
native-lib
native-lib-static
${log-lib})
Gradle-> app-> build-> assembleDebug / assembleRelease
然后你会得到libnative-lib-static.a
,在
app\.externalNativeBuild\cmake\debug(release)\<abi>\libnative-lib-static.a
该路径设置在app\build.gradle
:
android{
defaultConfig{
externalNativeBuild{
CMake{
我不确定ATM是否会在将来更改,但是您始终可以在项目文件夹中搜索*.a
文件。
我认为这次我不会错过任何事情。
所有归功于@Michael @Dan Albert @Alex Cohn @shizhen
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句