需求

现在有一个第三方库libstatic_add.a和对应的头文件static.h,要求封装一个Module,该Module依赖这个静态库,要求打包的Module包含该静态库。

方案

创建Android Studio Library  Project

创建Project时,记得添加"Include C++ Support",如果没有安装CMake,LLDB和NDK的话,记得安装一下。

项目创建好后,包括以下目录和文件(部分目录或文件是后面添加的):

build.gradle配置

针对app模块的build.gradle进行如下配置:

//改为library
apply plugin: 'com.android.library' //读取local.properties里的配置属性add_static_lib.dir,该属性指明libstatic_add.a静态库所在目录
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
def add_static_lib = properties.getProperty('add_static_lib.dir') android {
compileSdkVersion 27
defaultConfig {
minSdkVersion 16
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" //添加下面
ndk {
abiFilters 'armeabi-v7a'
// these platforms cover 99% percent of all Android devices
} externalNativeBuild {
cmake {
//添加下面
arguments '-DANDROID_PLATFORM=android-14',
'-DANDROID_TOOLCHAIN=clang',
'-DANDROID_ARM_NEON=TRUE',
'-DANDROID_STL=gnustl_static',
"-DPATH_TO_ADD_STATIC_LIB:STRING=${add_static_lib}"
cFlags '-O3', '-fsigned-char' // full optimization, char data type is signed
cppFlags '-fsigned-char', "-I${add_static_lib}"
}
}
}
//添加下面
sourceSets {
main {
jniLibs.srcDirs = ['src/main/cpp']
}
}
//添加下面
externalNativeBuild {
cmake {
path 'src/main/cpp/CMakeLists.txt'
}
}
//添加下面
sourceSets.main {
jni.srcDirs = []
jniLibs.srcDir 'src/main/libs'
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
} dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.0'
implementation 'com.android.support:design:27.1.1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

local.properties配置

针对app模块的local.propertise进行如下配置:

## This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Wed May 16 13:05:05 CST 2018
ndk.dir=D\:\\NanRi\\Android\\android-ndk-r16b
sdk.dir=C\:\\Users\\suning\\AppData\\Local\\Android\\Sdk //添加如下,指明libstatic_add.a静态库所在目录
add_static_lib.dir=D\:\\NanRi\\Android\\Android-Studio-Project\\ModuleProject\\app\\src\\main\\libs\\

CMakeLists.txt配置

针对app模块下的src\main\cpp\CMakeLists.txt配置如下:

cmake_minimum_required(VERSION 3.4.1)

set(
PATH_TO_ADD_STATIC_LIB
CACHE STRING ""
) message(${ANDROID_ABI}) file(GLOB CPP_FILES "*.cpp") add_library(
native-lib
SHARED
${CPP_FILES}
) include_directories(src/main/cpp)
include_directories(${PATH_TO_ADD_STATIC_LIB}) target_link_libraries(
native-lib
android
OpenSLES
${PATH_TO_ADD_STATIC_LIB}/libstatic_add.a
)

导出AAR

导出的AAR所在路径为“app\build\outputs\aar\app-debug.aar”

可以将app-debug.aar改为app-debug.zip,使用压缩工具打开,可以看到如下:

打开jni文件夹,可以看到里面包含了一个armeabi-v7a文件夹,该文件夹包含了libnative-lib.so库

Android Studio 打包AAR和第三方静态库的更多相关文章

  1. Android tips(八)-->Android Studio打包apk,aar,jar包

    文本我们将讲解android studio打包apk,aar,jar包的相关知识.apk包就是android系统的安装包,这里没什么好说的,aar包是android中独有的类库包,而jar包是java ...

  2. Android Studio打包apk,aar,jar包

    转载请标明出处:一片枫叶的专栏 文本我们将讲解android studio打包apk,aar,jar包的相关知识.apk包就是android系统的安装包,这里没什么好说的,aar包是android中独 ...

  3. Android Studio 打包及引用 aar

    Android Studio 打包及引用 aar 1. 简述 在比较大的 Android 项目的开发中,我们经常会遇到工程.jar 包等等之间相互引用的方式.一般我们通过在 gradle 文件中配置依 ...

  4. android开发 NDK 编译和使用静态库、动态库 (转)

    在eclipse工程目录下建立一个jni的文件夹 在jni文件夹中建立Android.mk和Application.mk文件 Android.mk文件: Android提供的一种makefile文件, ...

  5. Carthage 让项目支持及使用,第三方静态库转为动态库

    Carthage介绍 具体使用,可以查看官网的,文档地址 https://github.com/Carthage/Carthage.如果看不懂英文,可以看一下官文的翻译:https://www.jia ...

  6. eclipse 和 android studio 打包签名apk问题

    首先,我使用eclipse打包了一个签名apk 然后,我使用同一个签名文件在android studio 打包同一个项目 接下来,首先安装eclipse 打包的apk,然后安装android stud ...

  7. Android Studio打包未签名包

    Android Studio打包未签名包 好久没有写技术博客了,真有点懈怠了,作为35岁的程序员,转行重新捡起这些知识,还是挺犹豫纠结的,不过没啥其它办法,一点一滴开始吧,今天这开篇就小结点前几天工作 ...

  8. cmake的使用二:链接第三方静态库

    cmake的使用二:链接第三方静态库

  9. Firemonkey使用iOS的第三方静态库(Link Binary With Libraries)

    最近需要从内存流中直接播放音频,想到了使用第三方音频播放库bass.在windows上可以很方便的使用相应动态库(具体参考万一的博客),但在iOS上却没有相应的使用介绍,准确的说是没有用于Firemo ...

随机推荐

  1. css给列表添加序号

    .middle ul{ counter-reset: show-list; } li{ padding-left: 30px; line-height: 1.3; position: relative ...

  2. BZOJ1023:[SHOI2008]cactus仙人掌图(圆方树,DP,单调队列)

    Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus). 所谓简单回路就是指在图上不重复经过任何一个顶点 ...

  3. P1754 球迷购票问题

    题目背景 盛况空前的足球赛即将举行.球赛门票售票处排起了球迷购票长龙. 按售票处规定,每位购票者限购一张门票,且每张票售价为50元.在排成长龙的球迷中有N个人手持面值50元的钱币,另有N个人手持面值1 ...

  4. 【转】字符编码笔记:ASCII、Unicode、UTF-8 和 Base64

    1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态(-128~127),这被称为一 ...

  5. sizeof(自己摸索d)

    Sizeof() 判断数据类型长度符的关键字 sizeof用法 sizeof(类型说明符,数组名或表达式); 或sizeof (变量名); 定义 sizeof是C/C++中的一个操作符(operato ...

  6. AI 偏微分方程

    1.微分dx: 高阶无穷小 偏微分方程

  7. 【Codeforces Gym 100725K】Key Insertion

    Codeforces Gym 100725K 题意:给定一个初始全0的序列,然后给\(n\)个查询,每一次调用\(Insert(L_i,i)\),其中\(Insert(L,K)\)表示在第L位插入K, ...

  8. ESP8266开发综合篇(LUA开发-视频教程总揽)

    为了解决基础教程简单入门但不实用,项目方案非常实用但比较难的问题,开始推出8266开发综合篇 综合篇涉及到AT,LUA,SDK,LUA(sdk)开发,LUA和SDK开发会同步进行,后期再整理AT指令的 ...

  9. 2-(基础入门篇)Air202下载开发入门(给Air202下载第一个程序)

    http://www.cnblogs.com/yangfengwu/p/8887933.html 资料链接 链接:https://pan.baidu.com/s/1-SRfsKGQ7rZVvFmp1O ...

  10. LiveCharts文档-4基本绘图-1基本线条图

    原文:LiveCharts文档-4基本绘图-1基本线条图 4基本绘图-1基本线条图 using System; using System.Windows.Forms; using System.Win ...