android ndk生成第三方库的so方法(ndk-build,Application.mk,Android.mk)
PS:要转载请注明出处,本人版权所有。
PS: 这个只是基于《我自己》的理解,
如果和你的原则及想法相冲突,请谅解,勿喷。
前置说明
本文作为本人csdn blog的主站的备份。(BlogID=080)
本文发布于 2019-02-14 15:40:13,现用MarkDown+图床做备份更新。blog原图已丢失,使用csdn所存的图进行更新。(BlogID=080)
环境说明
无
前言
本文适合至少知道makefile,jni,ndk,gcc基本编译知识是什么鬼东西的人阅读。
背景
以前,关于android中使用jni相关的东西的时候(jni头文件生成,jni的so文件的生成),我太依赖与as工具了。导致了,什么都需要ide来完成,平常这么用的时候,其实是没有什么毛病的。但是比如说你要发布一个自己封装的库时候,自己在ide上配置然后编译其实是没有什么问题的,但是你把as工程发给别人的时候,总会遇到这样那样的问题,很烦。于是想着把生成android app使用的so独立出来,方便我们查找错误,同时也加深了自己对于android ndk的理解。
NDK
ndk 是android提供的原生开发包。它可以让android app可以利用c和c++的库等等。在我们安装的android sdk中,其实是就包含了ndk的内容,可以说ndk 部分内容是android系统可以正常运行的基石,因为在android 系统中,很多内容不适合使用java来开发,所以只能通过java调用c和c++的方式来实现相应的内容。
本文也是按照android开发者网站的ndk相关文档进行学习总结,同时也贴出一些基本错误方便排查。(https://developer.android.google.cn/ndk/guides/)
ndk-build 脚本
按照官方文档的说法:ndk-build 这个脚本在ndk r4的时候就存在了。它的主要作用就是初始化很多内容,然后执行gnu-make 来编译ndk部分的源码。
其核心执行的命令官网也给出来了:
GNUMAKE -f <ndk>/build/core/build-local.mk <parameters>
这里我们其实也知道了,要成功使用这个脚本必须安装gnu-make (还必须是3.81级以上的版本)
Android.mk文件
首先我们要明白,Android.mk只是一个makefile片段,这个片段中定义相关变量,然后被make命令使用和解析,我们只需要按照别人规定好的方法填写相应变量的值即可。
这里我主要使用了最基本的一些变量,同时提供相应的注释解释,如果要查看完整说明,请参考https://developer.android.google.cn/ndk/guides/中android.mk部分内容,实例如下:
LOCAL_PATH := $(call my-dir)
#这个LOCAL_PATH变量存储的是当前文件所在目录,是通过调用my-dir这个函数实现的
include $(CLEAR_VARS)
#CLEAR_VARS是一个特殊的makefile文件,其中清空了许多变量的值
LOCAL_MODULE := android-shmem
#LOCAL_MODULE填写的是你要生成的so的库名字的核心部分,这里生成的库名字为:libandroid-shmem.so
LOCAL_SRC_FILES := shmem.c
#LOCAL_SRC_FILES填写你要编译到so的源文件名字
include $(BUILD_SHARED_LIBRARY)
#BUILD_SHARED_LIBRARY指向一个特殊的makefile文件,将会收集以上的变量信息,然后生成动态库。
Application.mk文件
这个文件也是一个makefile文件,
我这里也列出一个实例来说明:
APP_CFLAGS += -std=c99
#做或者c++编程的都应该知道编译器编译参数设置
APP_CPPFLAGS +=
#做或者c++编程的都应该知道编译器编译参数设置
APP_LDFLAGS += -llog
#做或者c++编程的都应该知道编译器链接参数设置,这里是填写依赖了哪些动态库
APP_STL +=
#生成 对应 某一运行时库的动态库文件
APP_PIE = true
# 生成位置独立的代码,
APP_ABI = armeabi-v7a
#这个变量我们会经常遇到,主要是指定app或者说so运行的cpu指令集。
APP_PLATFORM = android-21
#这个对应的android版本号
这里的APP_ABI的内容对于我们来说特别重要,我这里把官网的内容搬过来了:
基于 ARMv5TE的设备硬件(采用软件浮点运算):APP_ABI := armeabi(兼容性最好,浮点运算性能差劲)
基于 ARMv7 的设备上的硬件 FPU 指令 APP_ABI := armeabi-v7a
ARMv8 AArch64 APP_ABI := arm64-v8a
IA-32 APP_ABI := x86
Intel64 APP_ABI := x86_64
MIPS32 APP_ABI := mips
MIPS64 (r6) APP_ABI := mips64
所有支持的指令集 APP_ABI := all
使用实例
如果直接运行ndk-build会报如下错误:
- Android NDK: Could not find application project directory !
- Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.
提示我们有个变量没有设置,我们设置上,后续还会提示其他的问题,我们一并设置,
ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk NDK_APPLICATION_MK=./Application.mk
- NDK_PROJECT_PATH 对应项目路径
- APP_BUILD_SCRIPT 对应Android.mk路径,这个变量有默认值,具体参考官网。
- NDK_APPLICATION_MK 对应Applicaiton.mk路径
结果:

后记
总结
文中只是介绍了非常基础的内容,如果需要一些骚操作,可能就会用到一些其他变量,对于这些内容,请参考文中提到的android开发者官网。
参考文献
- 无
打赏、订阅、收藏、丢香蕉、硬币,请关注公众号(攻城狮的搬砖之路)

PS: 请尊重原创,不喜勿喷。
PS: 要转载请注明出处,本人版权所有。
PS: 有问题请留言,看到后我会第一时间回复。
android ndk生成第三方库的so方法(ndk-build,Application.mk,Android.mk)的更多相关文章
- Android中集成第三方库的方法和问题
Android中集成第三方库的方法和问题 声明: 1. 本文參考了网上同学们的现有成果,在此表示感谢,參考资料在文后有链接. 2. 本文的重点在第三部分,是在开发中遇到的问题及解决的方法.第一,第二部 ...
- Android Studio导入第三方库的三种方法
叨叨在前 今天在项目中使用一个图片选择器的第三方框架——GalleryFinal,想要导入源码,以便于修改,于是上完查找了一下方法,想到之前用到过其他导入第三方库的方法,现在做个小总结,以防忘记. A ...
- [置顶] android利用jni调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so
0:前言: 在第二篇中,我们主要介绍了丙方android公司利用乙方C++公司给的动态库,直接调用库中的方法,但是这样方式受限于: 乙方C++公司开发的动态库是否符合jni的规范,如果不规范,则不能直 ...
- 用NDK调用第三方库
用NDK调用第三方库遇到不少坑,总结一下. 1.添加JNI目录 参考: http://www.cnblogs.com/lanqie/p/7442668.html 2.文件介绍: 其中:JniFacto ...
- 【转】Android中引入第三方Jar包的方法(java.lang.NoClassDefFoundError解决办法)
原文网址:http://www.blogjava.net/anchor110/articles/355699.html 1.在工程下新建lib文件夹,将需要的第三方包拷贝进来.2.将引用的第三方包,添 ...
- android studio 导入第三方库的记录
android studio 导入第三方库的记录.jar包 和 库 一.jar包 1.jar包的话很简单,首先换成project模式,将你要用的jar包复制到lib下面.如图 2.然后右键选择Add ...
- Android NDK生成共享库和静态库
Date: 2014-03-14 Title: Compile Android Native Binary And Library Published: true Type: post Tags: A ...
- 【Android Studio安装部署系列】十七、Android studio引用第三方库、jar、so、arr文件
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 在Android开发过程,经常需要用到第三方库以及jar.so.arr文件,那么如何引用到项目中呢?下面简单介绍下. 引用第三方库 ...
- 使用Android Studio导入第三方库项目
在使用Android Studio开发时,用到了第三方库SlidingMenu(现在已经不推荐使用了),尽管如此,但具体怎么导入第三方库还是需要知道的,在查阅各种资料后,知道了一种比较容易可行的方法 ...
- Android开发——发布第三方库到JitPack上
前言: 看到大神们的写的第三方控件,比较好用,我们使用的时候直接是在gradle上加上代码就可以使用了,现在到我们写了一个第三方控件,想要别人使用的时候也是直接在gradle加上相关的代码就可以用了, ...
随机推荐
- ch57x/ch58x开启仿真
本次使用的平台是MounRiver Studio,使用的是WCH的CH582m与WCH-LinkE 仿真之前确保LinkE处在Risc-V模式下 空闲时蓝灯常灭 Step1:首先通过ISP工具开启两 ...
- Linux的yum源配置总结
本文总结归纳了一系列Linux系统的各种yum配置,虽然不一定是标准配置,但都是自己曾真实测过可用的. 1.RHEL6 本地 yum源配置 2.CentOS6 本地 yum源配置 3.OEL5 本地 ...
- go Printf 语句的占位符 Format
func main() { var a uint8 = 12 var b = "wokao" fmt.Printf("查看类型:%T\n", a) //查看类型 ...
- 《ASP.ENT Core 与 RESTful API 开发实战》-- 读书笔记(第1章)
第 1 章 REST 简介 1.1 API 与 REST API 是一个系统向外暴露或公开的一套接口,通过这些接口,外部应用程序能够访问该系统 REST 是一种基于资源的架构风格,任何能够命名的对象都 ...
- TPCH-PostgreSQL生成数据集并导入数据表
1.数据集下载 TPC-H数据集: https://github.com/gregrahn/tpch-kit 2.解压安装 unzip tpch-kit-master.zip cd tpch-kit ...
- NC26257 小雨坐地铁
题目链接 题目 题目描述 小雨所在的城市一共有 \(m\) 条地铁线,分别标号为 1 号线,2 号线,--,m 号线.整个城市一共有 \(n\) 个车站,编号为 \(1 \sim n\) .其中坐 i ...
- Git 分支与合并
1. Git 对象 Git 的核心部分是一个简单的键值对数据库.可以向 Git 仓库中插入任意类型的内容,它会返回一个唯一的键,通过该键可以在任意时刻再次取回该内容. 所有内容均以树对象和数据对象的 ...
- DOM和BOM的区别
DOM和BOM的区别 在浏览器中运行的JavaScript可以认为由三部分组成:ECMAScript描述了该语言的语法和基本对象,DOM文档对象模型描述了处理网页内容的方法和接口,BOM浏览器对象模型 ...
- qt基础知识总结
qt基础知识总结 1.ctrl+r:快速运行 2.两种模式的区别: 一个是提供菜单栏的,一个不提供菜单栏 3.界面讲解 layouts:布局=水平布局+垂直布局+网格布局+表单布局 spacers:垫 ...
- Python全栈面试题及知识点总结
Python全栈面试题 Python全栈阶段总结:https://github.com/HkwJsxl/PythonFullStack/tree/master/Notes Python基础 基础 逻辑 ...