一. Android.mk

1.1. 什么是.mk

Android.mk是Android提供的一个makefile文件,可以将源文件分组为模块。用来引用的头文件目录、需要编译的*.c/*.cpp文件、jni源文件、指定编译生成*.so共享库文件或者*.a静态库文件,可以定义一个或多个模块,也可以多个模块中使用同一个源文件

1.2. .mk语法

1.2.1.  LOCAL_PATH := $(call my-dir)

每个Android.mk文件都以LOCAL_PATH开始,Build System提供的宏函数 my-dir,此变量返回包含的makefile的路径;

1.2.2. include $(CLEAR_VARS):

CLEAR_VARS变量由Build System提供,并指向一个特定的GNU Makefile,可为你清除LOCAL_xxx变量,但不会清除LOCAL_PATH变量;

因系统在单一GNU Make执行环境中解析所有构建控制文件,LOCAL_xxx变量是全局的,所以描述每个模块之前,声明此变量,可以清除所有了LOCAL_xxx,这样清理后避免相互影响;

1.2.3. LOCAL_MODULE

此变量声明模块名称,名称必须唯一且不含任何空格;

Build System在生成最终共享库文件时,会将"lib"作为前缀+模块名称+".so"作为共享库文件名称;

eg:LOCAL_MODULE    := ffmpeg-decoder

模块名称为ffmpeg-decoder生成共享库为libffmpeg-decoder.so;

1.2.4. LOCAL_SRC_FILES := FFmpegDecoder.cpp FFmpegConfigure.cpp

此变量必须包含要构建到模块中的C/C++源文件列表,不需要列出头文件和包含文件,系统会自动导入依赖;

eg: LOCAL_SRC_FILES := FFmpegDecoder.cpp FFmpegConfigure.cpp

1.2.5. LOCAL_C_INCLUDES

变量设置头文件的include目录列表;

eg: LOCAL_C_INCLUDES += $(LOCAL_PATH)/include

1.2.6. LOCAL_LDLIBS

此变量包含构建共享库或可执行文件时链接库,使用-l前缀传递特定系统库的名称,多个链接库之间使用空格作为分隔符;

NDK为Android版本提供新的头文件和库,文件路径:$NDK/platforms/android-<level>/<abi>/usr/include下;

-llog链接到系统的liblog.so文件,应用可以定义从原生代码向内核发送日志消息,路径:/system/lib/liblog.so,其实是导入<android/log.h>头文件,路径:$NDK/platforms/android-3/arch-arm/usr/include/android/log.h

变量列表:

-llog(日志库):导入log.h头文件

-lz(ZLib压缩库):添加zlib.h和zconf.h头文件;

-ldl(动态链接器库):添加dlfcn.h头文件,可以访问Android动态链接器的dlopen()、dlsym()和dlclose()函数;

-lGLESv3(OpenGL ES3.1库):此变量API 21开始,添加gl31.h和gl3ext.h头文件,提供了渲染机制,参考EGL原生平台接口;从API 9开始提供EGL API,可以使用GLSurfaceView;

-ljnigraphics:允许C/C++以可靠方式访问Java位图对象的像素缓冲区,导入bitmap.h头文件,jnigraphics工作流程参考:NDK API中的jnigraphics;

-lOpenMAXAL(多媒体库):导入OMXAL/OpenMAXAL.h和
                                                                       OMXAL/OpenMAXAL_Platform.h头文件,提供原生多媒体处
                                                                       理库;

-landroid(android原生头文件库): 原生头文件列表包括native_activity.h、looper.h、input.h、keycodes.h等等,如需了解头文件详情参考:NDK API参考文档;

eg:LOCAL_LDLIBS := -llog -lz

1.3. .mk实例

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := ./oled_test.c
LOCAL_SHARED_LIBRARIES := liblog libcutils
LOCAL_MODULE := oled_test
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_PATH := /home/network_share/test/oled
include $(BUILD_EXECUTABLE)

二. 编译

2.1. 早期的linux编译app是需要设置交叉编译链工具,现在安卓开发中,不再需要配置gcc,而是直接使用安卓编译环境

2.2. source ./build/envsetup.sh

2.3. lunch 现在相应版本

2.4. mmm external/yf_test/

rk3288 编译应用程序的更多相关文章

  1. 配置指定使用tcc编译器编译nim程序

    1.前言 nim是什么? nim是一门静态编译型语言,语法类似python,nim的代码被翻译成C代码再被C编译器编译成可执行文件.因此nim的可执行文件比较小,性能应该也不错. 最简单的nim程序就 ...

  2. java编译错误 程序包javax.servlet不存在javax.servlet.*

    java编译错误 程序包javax.servlet不存在javax.servlet.* 编译:javac Servlet.java 出现 软件包 javax.servlet 不存在 软件包javax. ...

  3. objective-c 创建工程/编译/运行程序

    // First program example #import <Foundation/Foundation.h> int main (int argc, const char * ar ...

  4. [转]编译VC++程序warning C4819快速解决

    文章来自:http://www.cppblog.com/API/archive/2012/11/12/195056.aspx 编译VC++程序的时候出现如下提示警告: warning C4819: T ...

  5. 【Qt】命令行编译Qt程序(nmake)【转】

    简述 前两节讲解了如何在Visual Studio和Qt Creator中搭建Qt开发环境,并分享了我们第一个小程序-Hello World. 下面分享如何使用命令行来编译Qt程序.当然,MSVC和M ...

  6. Linux/Ubuntu下 静态编译Qt程序

    一般情况下,我们用Qt编译出来的程序是要依赖于系统Qt库的,也就是这个程序移到别的没有安装Qt库的系统上是不能使用的.会提示缺少……库文件之类的错误.这就是动态编译的结果. 但是如果我们想编译一个程序 ...

  7. 利用csc.exe 手动编译C#程序

    1. 创建见 cs代码文件 using System; class TestApp{ static void Main() { Console.WriteLine("Test! 1,2,3& ...

  8. Linux下静态编译Qt程序

    一般情况下,我们用Qt编译出来的程序是要依赖于系统Qt库的,也就是这个程序移到别的没有安装Qt库的系统上是不能使用的.会提示缺少……库文件之类的错误.这就是动态编译的结果. 但是如果我们想编译一个程序 ...

  9. [置顶] ubuntu12.04下编译opencv程序

    ubuntu12.04下编译opencv程序 1.在ubuntu下安装好 opencv后(建议使用apt-get install 来安装) 2.使用程序FaceExaple.c来进行测试程序 #inc ...

随机推荐

  1. sublime text 编辑器的操作

    我一直在用的代码编辑器是sublime text,然后总结了一些相关的操作方法. 一 环境操作 1.放大显示比例:Ctrl+ 2.缩小显示比例:Ctrl- 3.分屏:Alt+ Shift +数字    ...

  2. poj 3685 Matrix 二分套二分 经典题型

    Matrix Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 5724   Accepted: 1606 Descriptio ...

  3. 【清华集训2016】Alice和Bob又在玩游戏

    不难的题目.因为SG性质,所以只需要对一棵树求出. 然后如果发现从上往下DP不太行,所以从下往上DP. 考虑一个点对子树的合并,考虑下一个删的点在哪一个子树,那么剩下的状态实际上就是把一个子树所有能达 ...

  4. SQL查询时踩得一些坑

    1.左右连接: left join:LEFT JOIN返回左表的全部行和右表满足ON条件的行,如果左表的行在右表中没有匹配,那么这一行右表中对应数据用NULL代替. inner join: 内连接是最 ...

  5. Oracle三种分页?

    ①select * from (select employee.*, rownum r from employee) where r between 2 and 5; ②select * from ( ...

  6. SELECT list is not in GROUP BY clause and contains nonaggregated

    安装了mysql5.7,用group by 查询时抛出如下异常 SQLSTATE[42000]: Syntax error or access violation: 1055 Expression # ...

  7. C# 利用AForge.NET开源类库实现 图像素描效果

    引入DLL: using AForge.Imaging; using AForge.Imaging.Filters; //using AForge.Video.DirectShow;可以使用摄像头图像 ...

  8. linux如何杀掉进程(kill)

    方法/步骤1: 使用“ps -e|grep mysql”命令,查看mysql程序的对应的pid号.结果如下图:   方法/步骤2: 使用“kill -9 2891”命令,可以结束掉mysqld_saf ...

  9. ArcGIS客户端API中加载大量数据的几种解决办法

    ArcGIS客户端API中加载大量数据的几种解决办法 2011-03-25 18:17 REST风格的一切事物方兴未艾,ArcGIS Server的客户端API(Javascript/Flex/Sil ...

  10. JavaWeb实现文件上传下载功能实例解析 (好用)

    转: JavaWeb实现文件上传下载功能实例解析 转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web ...