仅仅要涉及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. leetcode_655. Print Binary Tree

    https://leetcode.com/problems/print-binary-tree/ 打印整棵二叉树 class Solution { public: int getTreeHeight( ...

  2. 【东软实训】SQL函数

    SQL函数 SQL是用于访问和处理数据库的标准的计算机语言,我们所使用的的是Oracle SQL 一个数据库通常包含一个或多个表,每个表有一个名字表示,下图即为一个名为“emp”的表,接下来的操作都将 ...

  3. 在springBoot的控制台打印sql语句

    在springBoot+Mybatis日志显示SQL的执行情况的最简单方法就是在properties新增: properties形式 logging.level.com.eth.wallet.mapp ...

  4. 基于Redis的三种分布式爬虫策略

    前言: 爬虫是偏IO型的任务,分布式爬虫的实现难度比分布式计算和分布式存储简单得多. 个人以为分布式爬虫需要考虑的点主要有以下几个: 爬虫任务的统一调度 爬虫任务的统一去重 存储问题 速度问题 足够“ ...

  5. 初学微信小程序 TodoList

    微信小程序的学习 微信小程序的开始尝试 TodoList 微信开发者工具生成 目录如下: . |-- app.js |-- app.json |-- app.wxss |-- pages | |-- ...

  6. android 如何从activity跳转到另一个activity下指定的fragment

    思路: 跳转到目标fragment所在的activity,并传递一个flag,来确定要到哪个fragment,根据该flag判断后,跳转到指定的fragment即可. 代码: 当前界面: intent ...

  7. Python解释器的种类以及特点

    CPython 由C语言开发的  使用最广的解释器 IPython 基于cpython之上的一个交互式计时器 交互方式增强 功能和cpython一样 PyPy 目标是执行效率 采用JIT技术 对pyt ...

  8. PAT顶级 1002. Business (35)

    PAT顶级 1002. Business (35) As the manager of your company, you have to carefully consider, for each p ...

  9. UVa 1600 Patrol Robot(BFS)

    题意: 给定一个n*m的图, 有一个机器人需要从左上角(1,1)到右下角(n,m), 网格中一些格子是空地, 一些格子是障碍, 机器人每次能走4个方向, 但不能连续穿越k(0<= k <= ...

  10. Discuz 论坛修改admin账户密码

    打开Navicat for MySQL 找到数据表 pre_ucenter_members 把密码修改为123456789 password:047099adb883dc19616dae0ef2adc ...