Dar*_*rio 3 linker static android cmake gradle
我需要使用 CMakeLists.txt 将预构建的“.a”静态库链接到 Android Studio 项目。
.a 库正确构建为armeabi、armeabiv-7a、mips 和x86(甚至可以“objdumped”进行“内容检查”),“.h”文件也恰到好处。
目标不是将库源代码与我的 Android Studio 项目本机源代码一起重新编译。
另外,请不要参考使用 NDK + Andoid.mk(仅限 CMakeLists.txt)的解决方案。
由于网络上没有关于此问题的有效示例(包括 Google NDK 文档和 SO),因此请提供项目文件和/或项目结构所需的所有更改。
我将“.a”文件及其“include”目录保留在本地文件夹中,因此作为对此位置的元引用,请考虑 /lib.a 和 /include。
谢谢。
经过对这个主题的长期研究,这是一个可行的解决方案,但有一些小问题。
问题#1:
这应该通过将libxyz.a lib 文件及其包含目录放置在{AndroidStudioProjects 文件夹}/{项目名称}/app/libs中来实现,但由于某些(仍然未知)原因,在我的系统上它从未像这样工作。
我设法通过将两者(lib文件和包含目录)放置在: {AndroidStudioProjects文件夹}/{项目名称}/app/src/main/cpp/libs(必须创建)来使其工作。
问题#2:
我遇到了一些 32 位 x 64 位链接问题,因此,此时,我已经放弃了“胖 APK”并仅保留 32 位。
我做了什么
在CMakeLists.txt上添加:
add_library(xyz STATIC IMPORTED)
set_target_properties(xyz PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/libxyz.a)
Run Code Online (Sandbox Code Playgroud)
在 target_link_libraries (到您的共享本机库)上,您必须添加“xyz”引用:
target_link_libraries(
#the target shared lib:
native-lib
#other libs to link go here
xyz)
Run Code Online (Sandbox Code Playgroud)
额外的:
如果您希望能够使用默认的包含目录将头文件包含到libxyz.a的 C++ 代码中,如下所示:
#inlcude <xyz.h>
Run Code Online (Sandbox Code Playgroud)
您必须将其添加到CMakeLists.txt:
include_directories( ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/include )
Run Code Online (Sandbox Code Playgroud)
仅输出 32 位
在build.gradle (Module:app)上,转到“android defaultConfig”块,就在“externalNativeBuild”之前,然后添加 ndk abiFilters:
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.your.project"
minSdkVersion 21
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
ndk {
abiFilters 'armeabi-v7a', 'x86'
}
externalNativeBuild {
cmake {
cppFlags ""
}
}
}
Run Code Online (Sandbox Code Playgroud)
请随意改进这一点。
归档时间: |
|
查看次数: |
2562 次 |
最近记录: |