android打包规范包含第三方库aar,Android Studio 打包AAR和第三方静态库(示例代码)

需求

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

方案

创建Android Studio Library  Project

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

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

9a3f46ca62fd20a2b4f0434c99ef789d.png

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,使用压缩工具打开,可以看到如下:

af14f23f4ff66f8af2c7a35873fdefae.png

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564127.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 重载赋值运算符

在定义的同时进行赋值叫做初始化(Initialization),定义完成以后再赋值(不管在定义的时候有没有赋值)就叫做赋值(Assignment)。初始化只能有一次,赋值可以有多次。 当以拷贝的方式初…

android 扫描重复文件,Android Gradle在APK META-INF中复制的重复文件

我尝试在我的Android应用程序中添加spring但应用程序不运行.我真的不知道为什么我的跑步失败了.你能帮我解决这个问题,谢谢这是我的app / build.gradle配置:apply plugin: com.android.applicationandroid {compileSdkVersion 23buildToolsVersion "23.0.3&quo…

C++ 转换构造函数

在 C/C 中,不同的数据类型之间可以相互转换。无需用户指明如何转换的称为自动类型转换(隐式类型转换),需要用户显式地指明如何转换的称为强制类型转换。 自动类型转换示例: int a 6; a 7.5 a;编译器对 7.5 是作为…

android 媒体库扫描,如何扫描出Android系统媒体库中视频文件

Android系统启动时会去扫描系统文件,并将系统支持的视频文件(mp4,3gp,wmv)扫描到媒体库(MediaStore)中,下面代码演示如何获得这些文件的信息:publicstatic List sysVideoList null;// 视频信息集合sysVideoList new ArrayList();setVideoLi…

C++ 四种类型转换运算符

隐式类型转换是安全的,显式类型转换是有风险的,C语言之所以增加强制类型转换的语法,就是为了强调风险,让程序员意识到自己在做什么。 但是,这种强调风险的方式还是比较粗放,粒度比较大,它并没有…

Android leak内存,GitHub - jin870132/memoryleakdemo: 安卓内存泄露几种常见形式及解决方案...

安卓内存泄露几种常见形式及解决方案一.前言1.内存溢出与内存泄露内存溢出(oom),是指程序在申请内存时,没有足够的内存空间供其使用,出现oom;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。内存泄…

第二批鸿蒙手机排行,鸿蒙系统第二批升级机型有哪些 鸿蒙系统第二批升级机型名单一览...

华为6月2日召开开启鸿蒙发布会,很多华为手机的用户都想第一时间用上鸿蒙手机系统,今天就给大家带来鸿蒙系统第二批升级机型名单一览,一起来看看吧鸿蒙系统第二批升级机型名单一览具体机型:HUAWEI Mate20 SeriesHUAWEl nova 8 Seri…

C++ 异常类型以及多级catch匹配

exceptionType是异常类型,它指明了当前的 catch 可以处理什么类型的异常;variable是一个变量,用来接收异常信息。当程序抛出异常时,会创建一份数据,这份数据包含了错误信息,程序员可以根据这些信息来判断到…

火狐 html5 退出 白屏,Html5+ 后退按钮出现白屏(webView.back会白屏)

您好,打包装到 iPad 上去调试,A ->B 之后,第一次调用 webView.back 会显示白屏,页面切换使用的 webView.loadUrl ,代码如下:var sub plus.webview.create(_basePath pages/canlucate/canlucate.html, …

C++ throw

我们知道C 异常处理的流程,具体为: 抛出(Throw)--> 检测(Try) --> 捕获(Catch)异常必须显式地抛出,才能被检测和捕获到;如果没有显式的抛出&#xff0…

html移除click事件绑定,带你了解JQuery中绑定事件(bind())和移除事件(unbind())...

本文主要向大家详细介绍了jQuery的绑定事件和移除事件的使用方法和示例分享,这里推荐给有需要的小伙伴们参考下。有时候事件执行完了,想取消事件的效果可以通过一定的办法来处理。比如bind()(绑定事件)和unbind()(移除通过bind()方法添加的事件)方法来移…

html怎么设计自己的网页,求一份自己设计的简单网页 HTML格式

A:百格*特点:该仪器用于均匀划出一定规格尺寸的方格,通过评定方格内涂膜的完整程度来评定涂膜对基材附着程度,以‘级’表示。它主要用于有机涂料划格法附着力的测定,不仅适用于实验室,也可用于各种条件下的…

VC2010 项目的创建

在VC2010中创建一个项目 1 . 创建新项目。打开我们的VC2010,点工具栏第一个按钮(New Project),或者菜单 File -> New -> Project…,或者按快捷键 CtrlShiftN,几种方式都可以。 2 . 在 “New Project…

html5教学案例撰写,怎样撰写教育教学案例

怎样撰写教育教学案例教学是教师的教和学生的学所组成的一种人类特有的人才培养活动。那么,怎样撰写教育教学案例呢?下面是小编收集整理的撰写教育教学案例的相关内容,希望对您有所帮助!1.撰写教育教学案例的思想准备要写好教育、教学案例,首…

error C2143: syntax error : missing ';' before '}'

我们在运行C程序的时候经常会遇到错误&#xff0c;如果你遇到了这个错误&#xff1a;error C2143: syntax error : missing ‘;’ before ‘}’&#xff0c;那麽我将帮你解决这个错误。 错误展示 完整代码 #include <stdio.h> #define exchange(a,b){int t; ta;ab;bt} …

绘制彩虹html代码,HTML5 Canvas 彩虹螺旋图生成器

JavaScript语言&#xff1a;JaveScriptBabelCoffeeScript确定$(function() {var myCanvas, context, width, height;var lines [],numberOfLines 12;var colours [#FFD800, #FF6A00, #FF0000, #0094FF, #0026FF, #4800FF, #7FFF8E, #B6FF00, #4CFF00, #FFFFFF];var Line fu…

VC2010运行C程序时黑框一闪就没

黑框一闪就没如何解决的呢&#xff1f; 首先我们要知道为什么黑框一闪就没 闪一下是因为它执行完输出函数(printf)后直接返回系统了。 解决办法 在程序里加一个system(“pause”)&#xff0c;这个是调用系统函数&#xff0c;到时候会显示"按任意键退出"。 使用方…

厦门大学计算机科学与技术学院考研分数线,2020年厦门大学计算机科学与技术考研经验分享...

原标题&#xff1a;2020年厦门大学计算机科学与技术考研经验分享大家好&#xff0c;我是育明考研小赵老师关于2020年厦门大学计算机科学与技术考研信息汇总&#xff0c;请参考一、院校介绍厦门大学(Xiamen University)&#xff0c;简称厦大(XMU)&#xff0c;是中华人民共和国教…

Redis ops详解

Redis缓存数据库的ops问题 我们使用Java操作Redis数据库的时候&#xff0c;往往会输出和ops相关的内容&#xff0c;下面给大家讲解一下ops相关的内容。 ops是什么&#xff1f; redis中的OPS 即operation per second 每秒操作次数。意味着每秒对Redis的持久化操作。 所以我们…

山东大学继续教育计算机在线作业,山东大学继续教育数文字电子技术基础习题3及答案.docx...

精品文档精品文档PAGEPAGE5精品文档PAGE..数字电子技术基础模拟卷3一填空。1逻辑代数中&#xff0c;基本的运算关系是与、或和非。2十进制数27转换成二进制数为11011&#xff1b;转换成8421BCD码是3在逻辑代数中&#xff0c;AABAB&#xff1b;A1。4同一个逻辑函数可以有不同的逻…