Android Jni Android.mk经常使用语句
仅仅要涉及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经常使用语句的更多相关文章
- 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\ ...
- 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 ...: ...
- Android JNI的Android.mk文件语法详解
Android.mk简介: Android.mk文件用来告知NDK Build 系统关于Source的信息. Android.mk将是GNU Makefile的一部分,且将被Build System解 ...
- Android JNI入门第四篇——Android.mk文件分析
ndroid.mk文件是在使用NDK编译C代码时必须的文件,Android.mk文件中描述了哪些C文件将被编译且指明了如何编译.掌握Android.mk文件的编写主要是掌握其里头将要使用的一些关键字, ...
- Android编译系统(Android.mk文件详解)
[Android-NDK(Native Development Kit) docs文档] NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成a ...
- [转载]—— Android JNI知识点
Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 ...
- Android JNI 和 NDK
1.Android NDK 一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第 ...
- Android jni简便开发流程
<Android jni helloworld>中介绍了开发jni helloworld的步骤,本文将介绍jni简便开发流程 ① 写java代码 native 声明本地方法 ② 添加本地支 ...
- android JNI调用(转)
Android jni开发资料--NDK环境搭建 android开发人员注意了 谷歌改良了ndk的开发流程,对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwi ...
随机推荐
- Leetcode_638.Shopping Offers
https://leetcode.com/problems/shopping-offers/ In LeetCode Store, there are some kinds of items to s ...
- laravel UserRequest $request error
laravel UserRequest $request error Ask Question 0 laravel5.2,I create a UserRequest.php under Re ...
- day21-4 菱形继承问题(类的查找顺序)
目录 菱形继承问题 经典类(了解) 新式类 mro方法 菱形继承问题 在Python中子类可以同时继承多个父类,如A(B,C,D) 如果继承关系为非菱形结构,则会按照先找B这一条分支,然后再找C这条分 ...
- sqlalchemy ORM进阶- 批量插入数据
参考: https://www.jb51.net/article/49789.htm https://blog.csdn.net/littlely_ll/article/details/8270687 ...
- Android之多种Bitmap效果(4)
1. 将图片变为圆角 2. 获取缩略图图片 3. LOMO特效 4. 旧时光特效 5. 暖意特效 6. 根据饱和度.色相.亮度调整图片 7. 添加图片外边框 8. 添加内边框 9. 创建一个缩放的图片 ...
- 笔试算法题(36):寻找一棵二叉树中最远节点的距离 & 根据二叉树的前序和后序遍历重建二叉树
出题:求二叉树中距离最远的两个节点之间的距离,此处的距离定义为节点之间相隔的边数: 分析: 最远距离maxDis可能并不经过树的root节点,而树中的每一个节点都可能成为最远距离经过的子树的根节点:所 ...
- thinkPHP5搭建以及使用
0X01 Thinkphp 的安装 我这里选择的是使用 windows 下的 composer 进行安装,收下首先下载 composer 这个工具,安装完成以后进入我们想要创建项目的文件夹输入下面的命 ...
- 数据结构代码实现之队列的链表实现(C/C++)
上班闲着无聊,一直想着要开始写博客,但又不知道写什么.最近又回顾了下数据结构的知识,那就从数据结构开始吧. 前言 关于C语言结构体的知识以及队列的特性请读者自行了解,此处不做过多解释,嘻嘻. 同时此篇 ...
- 集训第四周(高效算法设计)C题 (二分查找优化题)
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...
- Python基础—线程、进程和协程
今天已是学习Python的第十一天,来干一碗鸡汤继续今天的内容,今天的鸡汤是:超越别人对你的期望.本篇博客主要介绍以下几点内容: 线程的基本使用: 线程的锁机制: 生产者消费之模型(队列): 如何自定 ...