Android编程使用NDK必须创建一个jni文件夹,并且jni文件里一般包含有C/C++的源码文件、Android..mk文件、Application.mk文件(可选),Android.mk文件的编写是重点。

Android.mk文件学习
Android.mk文件告诉编译器将C/C++的源码文件编译成动态库、静态库或者可执行程序,具体的可以参考android-ndk-r9\docs下的文档ANDROID-MK.html。
BUILD_SHARED_LIBRARY 编译成动态库
BUILD_STATIC_LIBRARY 编译成静态库
BUILD_EXECUTABLE 编译生成标准可执行程序 标准的Android.mk文件的实例:
#必须以LOCAL_PATH变量开头
LOCAL_PATH := $(call my-dir) #清除变量
include $(CLEAR_VARS) #生成模块的名称
LOCAL_MODULE := hello
# C /C++源码
LOCAL_SRC_FILES := hello.cpp #编译生成动态共享库
include $(BUILD_SHARED_LIBRARY)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1. 构建多个动态共享库
一个单独的Android.mk文件可以产生多个共享库模块,在Android.mk文件中定义多个模块即可。
#必须以LOCAL_PATH变量开头
LOCAL_PATH := $(call my-dir) #
#模块1
# #清除变量
include $(CLEAR_VARS) #生成模块1的名称
LOCAL_MODULE := hello1
#C++源码
LOCAL_SRC_FILES := hello1.cpp #编译生成共享库
include $(BUILD_SHARED_LIBRARY) #
#模块2
# #清除变量
include $(CLEAR_VARS) #生成模块2的名称
LOCAL_MODULE := hello2
#C++源码
LOCAL_SRC_FILES := hello2.cpp #编译生成共享库
include $(BUILD_SHARED_LIBRARY) #产生两个.so动态库文件即hello1.so和hello2.so
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2. 构建静态库
在Android应用程序中很少直接使用静态库,静态库一般是用来构建动态共享库,比如将第三方代码编译成静态库然后并入共享库。
#必须以LOCAL_PATH变量开头。
LOCAL_PATH := $(call my-dir) #
#第三方模块AVI库
# #清除变量
include $(CLEAR_VARS) #生成模块的名称
LOCAL_MODULE := avilib
#C源码
LOCAL_SRC_FILES := avilib.cpatform.c #编译生成静态库
include $(BUILD_STATIC_LIBRARY) ################################################################### #
#原生模块
# #清除变量
include $(CLEAR_VARS) #生成模块的名称
LOCAL_MODULE := hello
#C源码
LOCAL_SRC_FILES := hello.c #引用第三方静态库avilib
LOCAL_STATIC_LIBRARIES := avilib #编译生成共享库
include $(BUILD_SHARED_LIBRARY)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3. 用共享库构建通用模块
当多个共享库与同一个静态库连接时,静态库会产生多个副本,会增加应用程序的大小;因此最好将其编译成动态共享库库,供多个共享库调用。
#必须以LOCAL_PATH变量开头
LOCAL_PATH := $(callmy-dir) #
#第三方模块AVI库
# #清除变量
include $(CLEAR_VARS) #生成模块的名称
LOCAL_MODULE := avilib
#C源码
LOCAL_SRC_FILES := avilib.cpatform.c #编译生成动态共享库
include $(BUILD_SHARED_LIBRARY) ################################################################### #
#原生模块1
# #清除变量
include $(CLEAR_VARS) #生成模块的名称
LOCAL_MODULE := hello1
#C源码
LOCAL_SRC_FILES := hello1.c #引用第三方动态共享库avilib
LOCAL_SHARED_LIBRARIES := avilib #编译生成动态共享库
include $(BUILD_SHARED_LIBRARY) #
#原生模块2
# #清除变量
include $(CLEAR_VARS) #生成模块的名称
LOCAL_MODULE := hello2
#C源码
LOCAL_SRC_FILES := hello2.c #引用第三方动态共享库avilib
LOCAL_SHARED_LIBRARIES := avilib #编译生成动态共享库
include $(BUILD_SHARED_LIBRARY)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4. 使用Prebuilt库
前面的三种库文件的调用都有一个要求:必须将C/C++源码文件包含在NDK项目工程中,自R3以后Android的NDK提供了对Prebuilt库的支持,不需要源码文件就可以发布你的模块给他人使用。
预构建共享库模块的Android.mk文件
#必须以LOCAL_PATH变量开头
LOCAL_PATH := $(call my-dir) #
#第三方预构建AVI库
# #清除变量
include $(CLEAR_VARS) #生成模块的名称
LOCAL_MODULE := avilib
#预构建so库
LOCAL_SRC_FILES := libavilib.so #编译生成动态共享库
include $(PREBUILD_SHARED_LIBRARY)
使用Prebuilt共享库
LOCAL_SHARED_LIBRARIES := avilib
说明:还可以编译成PREBUILT_STATIC_LIBRARY类型的Prebuilt静态库
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5. 构建独立的可执行文件
为方便测试和快速原型设计,AndroidNDK支持编译生成独立的可执行文件,不需要打包成APK文件,就可以复制到Android设备中作为Linux应用程序直接执行。
#必须以LOCAL_PATH变量开头
LOCAL_PATH := $(call my-dir) #
#模块
# #清除变量
include $(CLEAR_VARS) #生成模块1的名称
LOCAL_MODULE := hello
#C++源码
LOCAL_SRC_FILES := hello.cpp #编译生成可执行文件
include $(BUILD_EXECUTABLE)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6. 在多个NDK项目间共享模块
共享avilib文件的Android.mk文件
#必须以LOCAL_PATH变量开头
LOCAL_PATH := $(call my-dir) #
#第三方AVI库
# #清除变量
include $(CLEAR_VARS) #生成模块的名称
LOCAL_MODULE := avilib
#C源码
LOCAL_SRC_FILES := avilib.c patform.c #编译生成静态库
include $(BUILD_SHARED_LIBRARY) 使用共享模块的NDK项目工程
#
#原生模块
# #清除变量
include $(CLEAR_VARS) #生成模块的名称
LOCAL_MODULE := hello
#C源码
LOCAL_SRC_FILES := hello.c #引用第三方动态共享库avilib
LOCAL_SHARED_LIBRARIES := avilib #编译生成共享库
include $(BUILD_SHARED_LIBRARY) $(call import-module,transcode/avilib)
为了避免冲突,应该将import-module函数宏放在Android.mk文件的末尾。import-module函数宏默认只搜索<Android NDK>/sources目录,为了让它搜索其他的目录必须设置环境变量NDK_MOUDLE_PATH值为要搜索的目录路径。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
7. 条件操作
在Android.mk文件中也可以有条件操作,例如在每个体系结构中包含不同源文件:
...
ifeq($(TARGET_ARCH),arm)
LOCAL_SRC_FILES + = armonly.c
else
LOCAL_SRC_FILES + = generic.c
endif
... Application.mk文件学习
Application.mk文件是AndroidND构建系统使用的可选构建文件。它的目的是描述应用程序需要那些模块;它也定义所有模块的通用变量。
Application.mk文件的例子:
#APP_ABI默认为armeabi可以更改,ABI生成二进制文件
#APP_ABI := armeabi mips也可以是多个
#APP_ABI := all 为所有支持的ABI生成二进制文件
APP_ABI := armeabi
#生成程序运行支持的平台
APP_PLATFORM := android-8 #对STL的支持
APP_STL := stlport_static #对异常的支持
APP_CPPFLAGS += -fexceptions #对RTTI的支持
APP_CPPFLAGS += -frtti 对Application.mk文件具体的信息可以仔细阅读android-ndk-r9\docs下的文档APPLICATION-MK.html。

Android NDK编程之Android.mk和Application.mk的更多相关文章

  1. Android NDK开发指南(一) Application.mk文件

    http://www.cnblogs.com/yaozhongxiao/archive/2012/03/06/2381586.html Application.mk目的是描述在你的应用程序中所需要的模 ...

  2. Android: NDK中的Android.mk和Application.mk

    1. 简介 Android.mk  可用来描述要编译的某个具体模块的相关信息.比如:指定编译该模块时所需要的源文件.编译该模块时要链接的库文件.该模块编译完成后生成的库的名字等等.Applicatio ...

  3. 关于jni编译32位、64位动态库(Android.mk和Application.mk文件)

    最近新项目需要编译64位的动态库,这里记录如何配置. 在jni目录下加入Android.mk和Application.mk文件. Application.mk APP_ABI := armeabi a ...

  4. Android NDK开发之Android.mk文件

    Android NDK开发指南---Android.mk文件 博客分类: Android NDK开发指南   Android.mk文件语法详述 介绍: ------------ 这篇文档是用来描述你的 ...

  5. Android 网络编程之HttpURLConnection运用

    Android 网络编程之HttpURLConnection 利用HttpURLConnection对象,我们可以从网络中获取网页数据. 01 URL url = new URL("http ...

  6. Android NDK 学习之Android.mk

    Android.mk file syntax specification Introduction: This document describes the syntax of Android.mk  ...

  7. Android网络编程之HttpClient运用

    Android网络编程之HttpClient运用 在 Android开发中我们经常会用到网络连接功能与服务器进行数据的交互,为此Android的SDK提供了Apache的HttpClient来方便我们 ...

  8. 简单的调用OpenCV库的Android NDK开发 工具Android Studio

    前言 本博客写于2017/08/11, 博主非专业搞安卓开发, 只是工作的需要倒腾了下Android NDK相关的开发, 博文中有什么不正确.不严格的地方欢迎指正哈    本文后续也许还会有删改, 就 ...

  9. Android NDK学习(二):编译脚本语法Android.mk和Application.mk

    一.Android.mk Android.mk分为一下几部分: LOCAL_PATH:= $(call my-dir), 返回当前文件在系统中的路径,Android.mk文件开始时必须定义该变量. i ...

随机推荐

  1. 【图像处理】使用OpenCV+Python进行图像处理入门教程(二)

    这篇随笔介绍使用OpenCV进行图像处理的第二章 图像的运算,让我们踏上继续回顾OpenCV进行图像处理的奇妙之旅,不断地总结.回顾,以新的视角快速融入计算机视觉的奥秘世界. 2  图像的运算 复杂的 ...

  2. WPF 基础 - 资源

    为了避免丢失和损坏,编译器允许我们把外部文件编译进程序主体.成为程序主体不可分割的一部分,这就是传统意义上的程序资源,即二进制资源: WPF 的四个等级资源: 数据库里的数据 (仓库) 资源文件 (行 ...

  3. 分形、分形几何、数据可视化、Python绘图

    本系列采用turtle.matplotlib.numpy这三个Python工具,以分形与计算机图像处理的经典算法为实例,通过程序和图像,来帮助读者一步步掌握Python绘图和数据可视化的方法和技巧,并 ...

  4. P1092 虫食算 题解(搜索)

    题目链接 P1092 虫食算 解题思路 好题啊!这个搜索好难写...... 大概是要考虑进位和考虑使用过某个数字这两个东西,但就很容易出错...... 首先这个从后往前搜比较好想,按照从后往前出现的顺 ...

  5. P1090 合并果子(JAVA语言)

    题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...

  6. javascript常用方法封装

    1,获取链接上的参数 getQueryString = (name, search) => { search = search || window.location.search.substr( ...

  7. Dynamics CRM分享记录后出现关联记录被共享的问题

    Dynamics CRM的权限配置有许多的问题,其中分享功能也是未来解决标准功能分配的权限不满足需求而设计的.但是这个功能使用的时候也要注意,否则会出现其他记录被共享的问题导致数据泄露可能会对项目的安 ...

  8. 北航OO第一单元作业总结(Retake)

    前言:当我写这篇博客的时候,我的心情是复杂的,因为这实际上是我第二次写这篇博客--我今年重修的这门课.我对去年的成绩心有不甘--在激烈的竞争下,我虽然尽可能完成了所有作业(仅一次作业未通过弱测),但爆 ...

  9. Java实现基于朴素贝叶斯的情感词分析

    朴素贝叶斯(Naive Bayesian)是一种基于贝叶斯定理和特征条件独立假设的分类方法,它是基于概率论的一种有监督学习方法,被广泛应用于自然语言处理,并在机器学习领域中占据了非常重要的地位.在之前 ...

  10. dubbo负载均衡策略和集群容错策略都有哪些?动态代理策略呢?

    (1)dubbo负载均衡策略 1)random loadbalance 默认情况下,dubbo是random load balance随机调用实现负载均衡,可以对provider不同实例设置不同的权重 ...