仅仅要涉及JNI开发都涉及到Android.mk编写,它也是一种makefile语言.

以上一篇博客中提供的project为例!

<1> : 信息打印 : 既然是一种简易语言那么首先应该知道可以打印脚本信息的语法部分:一个是基本信息类型,一个是警告,错误类型

$(info TEXT......) 这个函数运行的时候,会输出: TEXT... ...

$(error TEXT......)
这个函数被运行的时候,会输出:TEXT......,而且终止make的运行.
$(warning TEXT......)
这个函数被运行的时候,会输出:TEXT......,可是make会继续运行下去.

仅仅要在Android.mk中加入上面的部分,就能够打印Android.mk文件里基本信息.

比如:

LOCAL_PATH := $(call my-dir)
$(warning $(LOCAL_PATH))

build so库时,控制台打印出:

jni/Android.mk:2: jni

<2> : Android.mk的树形组织结构从顶究竟链接 : 假设大部分c库都在jni/libmp3lame/文件夹下,那么一般在libmp3lame子文件夹下也最好写一个Android.mk的文件,事实上android的jni是遵循了linux的文件树管理方式,比方我在上面的libmp3lame文件夹下新建一个Android.mk文件:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := lamejni

LOCAL_SRC_FILES := bitstream.c \
encoder.c \
fft.c \
gain_analysis.c \
id3tag.c \
lame.c \
mpglib_interface.c \
newmdct.c
LOCAL_SRC_FILES += presets.c \
psymodel.c \
quantize_pvt.c \
quantize.c \
reservoir.c \
set_get.c \
tables.c \
util.c
LOCAL_SRC_FILES += takehiro.c \
vbrquantize.c \
VbrTag.c \
version.c
LOCAL_SRC_FILES += xmm_quantize_sub.c LOCAL_LDLIBS := -llog include $(BUILD_SHARED_LIBRARY)

然后在jni根文件夹Android.mk改动为:

LOCAL_PATH := $(call my-dir)
$(warning $(LOCAL_PATH))
DURIAN_MAKEFILE_DIR := ./libmp3lame
LOCAL_SRC_FILES := durianlame.c durianutils.c include $(LOCAL_PATH)/./$(DURIAN_MAKEFILE_DIR)/Android.mk

当中通过编译器的include 将所须要的mk文件包括进来就可以,当中LOCAL_PATH获取的,其它的后面是路径 :

include $(LOCAL_PATH)/./$(DURIAN_MAKEFILE_DIR)/Android.mk

加入一条打印记录:

$(warning $(DURIAN_MAKEFILE_DIR)/Android.mk)

输出:

jni/Android.mk:8: ./libmp3lame/Android.mk

以下给一个通用的写法:通过给出的子文件夹路径,搜寻全部子文件夹下的Android.mk文件:

include $(foreach m,$(DURIAN_MAKEFILE_DIR),$(LOCAL_PATH)/./$m/Android.mk)
#include $(LOCAL_PATH)/./$(DURIAN_MAKEFILE_DIR)/Android.mk

凝视掉前面的方法.

当然也有第二种solo所有树以下的写法,个人不推荐:

include $(call all-subdir-makefiles)

<3> : 全部相关的c或者cpp文件 : 相同通过遍历指定子文件夹下的方式进行:还是紧接着上面的Android.mk内容进行改动:

DURIAN_C_SRCS_DIR :=$(LOCAL_PATH)
DURIAN_ALL_C_SRCS := $(foreach m,$(DURIAN_C_SRCS_DIR),$(wildcard $m/*.c))
$(info $(DURIAN_ALL_C_SRCS))
LOCAL_SRC_FILES := $(DURIAN_ALL_C_SRCS) #durianlame.c durianutils.c

上面是在LOCAL_PATH文件夹,这个文件夹在根文件夹中就是jni跟文件夹,只是可能非常多子文件夹下Android.mk也有,这个时候LOCAL_PATH的路径就是指向子文件夹,<1>中也给出的调试信息显示也是jni文件夹.在这个文件夹下wildcard后返回这个文件夹下全部的c文件列表信息,

wildcard使用方法:

$(wildcard PATTERN...)
它被展开为已经存在的、使用空格分开的、匹配此模式的全部文件列表。假设不存在不论什么符合此模式的文件。函数会忽略模式字符并返回空.

注意它的返回值,它返回的是一个列表信息.

以下将其改到libmp3lame下的Android.mk文件:

LOCAL_PATH := $(call my-dir)

$(info $(LOCAL_PATH))
include $(CLEAR_VARS) LOCAL_MODULE := lamejni LOCAL_SRC_FILES := bitstream.c \
encoder.c \
fft.c \
gain_analysis.c \
id3tag.c \
lame.c \
mpglib_interface.c \
newmdct.c
LOCAL_SRC_FILES += presets.c \
psymodel.c \
quantize_pvt.c \
quantize.c \
reservoir.c \
set_get.c \
tables.c \
util.c
LOCAL_SRC_FILES += takehiro.c \
vbrquantize.c \
VbrTag.c \
version.c
LOCAL_SRC_FILES += xmm_quantize_sub.c $(info $(LOCAL_SRC_FILES)) LOCAL_LDLIBS := -llog include $(BUILD_SHARED_LIBRARY)

C文件非常多,加入的时候肯定非常麻烦.

能够更改例如以下:

DURIAN_C_SRCS_DIR :=$(LOCAL_PATH)
DURIAN_ALL_C_SRCS := $(foreach m,$(DURIAN_C_SRCS_DIR),$(wildcard $m/*.c))
DURIAN_ALL_C_SRCS := $(subst $(LOCAL_PATH)/,,$(DURIAN_ALL_C_SRCS))
LOCAL_SRC_FILES := $(DURIAN_ALL_C_SRCS)

请注意:

DURIAN_ALL_C_SRCS := $(subst $(LOCAL_PATH)/,,$(DURIAN_ALL_C_SRCS))

subst是将前面的DURIAN_ALL_C_SRCS获取的列表的子文件夹libmp3lame名字所有去掉,读者能够凝视掉这一行,看看打印的LOG信息就知道了.当然在jni根文件夹下也能够使用,更加通用.

有时候要用到其它的so,假设人家仅仅是提供so和so相应的头文件,那么so放到libs以下,头文件通过放到一个单独的文件夹,相同通过上面的方式导入头文件.

<4> : LOCAL_CFLAGS 使用方法:这个标记全然是针对编译器的,宏定义的变相写法.

在某些时候,编译源代码须要定义宏变量,这个时候,我们能够直接在相应的源代码里面去改动,但也有一些情况,我们是没法在别人的源代码里定义宏变量的,这个时候,就须要使用到LOCAL_CFLAGS 了 ,举比例如以下:
Java代码
LOCAL_CFLAGS += -D__FAVOR_BSD
这行代码的作用就是在原有的cflags基础上,再定义一个宏变量__FAVOR_BSD
相似于#define __FAVOR_BSD

LOCAL_CFLAGS: 可选的编译器选项。在编译 C 代码文件的时候使用。

这可能是有
用的,指定一个附加的包括路径(相对于NDK的顶层文件夹),宏定义,或者编译选项。
 注意:不要在 Android.mk 中改变 optimization/debugging 级别。仅仅要在 Application.mk 中指定合适的信息。就会自己主动地为你处理这个问题,在调试期间,会让 NDK自己主动生成实用的数据文件

还是在举一个有实际意义的样例吧:

在Android.mk文件加入:

LOCAL_CFLAGS += -DDURIAN_DEFINE   //定义了该宏,能够在代码中推断

相当于定义了DURIAN_DEFINE的一个宏.

以下详细使用方法:在你的程序里面通过以下的推断是否调用函数getdurianinformation.

#ifdef DURIAN_DEFINE
getdurianinformation();
#endif

因为上面的是网上问得最多的,所以特别提出来,其余的參考我的cnblog博客上的:

http://www.cnblogs.com/MMLoveMeMM/articles/3909809.html

<5> : 书写Android.mk可能须要非常多,可是实际经常使用的函数,能够归结例如以下:

1、wildcard : 扩展通配符
2、notdir : 去除路径
3、patsubst :替换通配符

另一个字符相减的函数subst

当然不同公司和project可能还有很多其它.

Android Jni Android.mk经常使用语句的更多相关文章

  1. Cocos2dx Android环境编译出错:jni/Android.mk: Cannot find module with tag 'scripting/lua-bindings' in import path

    解决方案为: 在项目proj.android\jni\Android.mk(D:\my_lua_test2\MyluaTest\frameworks\runtime-src\proj.android\ ...

  2. Android_NDK问题:APP_BUILD_SCRIPT points to an unknown file: <project_path>/jni/Android.mk

    问题详情: Android NDK: Your APP_BUILD_SCRIPT points to an unknown file: <path>/jni/Android.mk ...: ...

  3. Android JNI的Android.mk文件语法详解

    Android.mk简介: Android.mk文件用来告知NDK Build 系统关于Source的信息. Android.mk将是GNU Makefile的一部分,且将被Build System解 ...

  4. Android JNI入门第四篇——Android.mk文件分析

    ndroid.mk文件是在使用NDK编译C代码时必须的文件,Android.mk文件中描述了哪些C文件将被编译且指明了如何编译.掌握Android.mk文件的编写主要是掌握其里头将要使用的一些关键字, ...

  5. Android编译系统(Android.mk文件详解)

    [Android-NDK(Native Development Kit)  docs文档] NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成a ...

  6. [转载]—— Android JNI知识点

    Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 ...

  7. Android JNI 和 NDK

    1.Android NDK 一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第 ...

  8. Android jni简便开发流程

    <Android jni helloworld>中介绍了开发jni helloworld的步骤,本文将介绍jni简便开发流程 ① 写java代码 native 声明本地方法 ② 添加本地支 ...

  9. android JNI调用(转)

    Android jni开发资料--NDK环境搭建 android开发人员注意了 谷歌改良了ndk的开发流程,对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwi ...

随机推荐

  1. 阿里云ECS安装sqlserver,本地无法连接问题排查思路

    1. 阿里云控制台-对应的ECS实例的安全组是否添加了响应的端口(1433)可以访问: 2. 服务器-sqlserver服务是否开启: 3. 服务器-sqlserver配置器,对应的端口是否启用,已经 ...

  2. 编写高质量Python代码的59个有效方法

    Python学习资料或者需要代码.视频加Python学习群:960410445 1. 用Pythonic方式思考 第一条:确认自己使用的Python版本 (1)有两个版本的python处于活跃状态,p ...

  3. PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (五) -- 自动 ACK、手动 ACK、NACK

    以 Direct 类型的 交换机和 Queue 的 get 方法为例. producer.php // 连接设置 $conConfig = [ 'host' => '127.0.0.1', 'p ...

  4. python3+beautifulSoup4.6抓取某网站小说(三)网页分析,BeautifulSoup解析

    本章学习内容:将网站上的小说都爬下来,存储到本地. 目标网站:www.cuiweijuxs.com 分析页面,发现一共4步:从主页进入分版打开分页列表.打开分页下所有链接.打开作品页面.打开单章内容. ...

  5. Tab键可访问的下拉菜单demo

    <ul id="navigationRegion"> <li token="1" class="index_on"> ...

  6. CentOS7-wget命令

    Wget主要用于下载文件,在安装软件时会经常用到,以下对wget做简单说明.转载自:https://www.cnblogs.com/lxz88/p/6278268.html 1.下载单个文件:wget ...

  7. dubbo理解

    Dubbo服务的调用基本上都是出现在分布式项目中,最常见的电商网站.涉及买卖的APP等. 比如某个购物APP,目前最常见的架构就是做成分布式架构,拆分成很多个系统,比如用户模块.短信模块.产品模块.订 ...

  8. Laravel核心解读 -- 扩展用户认证系统

    扩展用户认证系统 上一节我们介绍了Laravel Auth系统实现的一些细节知道了Laravel是如何应用看守器和用户提供器来进行用户认证的,但是针对我们自己开发的项目或多或少地我们都会需要在自带的看 ...

  9. Codeforces450 B. Jzzhu and Sequences

    B. Jzzhu and Sequences time limit per test 1 second memory limit per test 256 megabytes input standa ...

  10. 谷歌应用商店chrome扩展程序和APP的发布流程

    互联网上有很多大牛,他们再工作中需要一些难题,再找到解决办法后,如果会使用js的话,大多数人就可以自己动手写一个chrome插件,而且非常容易.开发人员都喜欢与大家分享自己的成就!google是一个全 ...