#PS:要转载请注明出处,本人版权所有

#PS:这个只是 《 我自己 》理解,如果和你的

#原则相冲突,请谅解,勿喷

本文适合至少知道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.soLOCAL_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-v7aARMv8 AArch64APP_ABI := arm64-v8aIA-32APP_ABI := x86Intel64APP_ABI := x86_64MIPS32APP_ABI := mipsMIPS64 (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:要转载请注明出处,本人版权所有.

有问题请留言,看到后我会第一时间回复

更多相关文章

  1. Android学习记录(4)—在java中学习多线程下载的基本原理和基本用法
  2. Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原
  3. Android之Activity之间的数据通信方式大全(一)
  4. Android(安卓)Alert Dialog解决点击按钮对话框不关闭/的问题
  5. Android平台调用so库中函数的流程及一些坑
  6. android中的反编译
  7. Android(安卓)热修复其实很简单
  8. 下面就介绍下Android(安卓)NDK的入门学习过程
  9. Android学习系列(3)--App自动更新之自定义进度视图和内部存储

随机推荐

  1. 使用phpMyAdmin修改MySQL数据库root用户
  2. 通过系统数据库获取用户所有数据库中的视
  3. 一段脚本实现自动备份并保存最近几天的SQ
  4. sql查询表中根据某列排序的任意行语句
  5. sql使用cast进行数据类型转换示例
  6. sql将一个表中的数据插入到另一个表中的
  7. sql多表行转列、级联行转列示例代码
  8. sql时间格式化输出、Convert函数应用示例
  9. 积分获取和消费的存储过程学习示例
  10. MSSQL报错:参数数据类型 text 对于 replac