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 ...
随机推荐
- js设计模式-发布/订阅模式
一.前言 发布订阅模式,基于一个主题/事件通道,希望接收通知的对象(称为subscriber)通过自定义事件订阅主题,被激活事件的对象(称为publisher)通过发布主题事件的方式被通知. 就和用户 ...
- eigenface资料整合
把图片映射到能最好区分的空间(pca),在这个空间同类是聚集的,而不同类之间间隔大.这相当于一个模型,把验证集也映射到此空间,然后利用knn对验证集分类. pca:https://wenku.baid ...
- 00PostgreSQL
PostgreSQL PostgreSQL: The World's Most Advanced Open Source Relational Database;PostgreSQL是一个功能强大的开 ...
- 第3节 mapreduce高级:12、mapreduce相关的参数调整
5.1 多job串联 一个稍复杂点的处理逻辑往往需要多个mapreduce程序串联处理,多job的串联可以借助mapreduce框架的JobControl实现 示例代码: ControlledJob ...
- vue 改变插值方法
Vue默认的插值是双大括号{{}}.但有时我们会有需求更改这个插值的形式. delimiters:['${','}'] //必须要用一个数组来接收,用逗号隔开.
- 装饰器(python)
一,装饰器定义:本质就是函数,功能是为其他函数添加新功能原则:1.不修改被装饰函数的源代码(开放封闭原则)2.为被装饰函数添加新功能后,不修改被修饰函数的调用方式3.装饰器=高阶函数+函数嵌套+闭包高 ...
- 零基础入门学习Python(34)--丰富的else语句及简洁的with语句
知识点 else语句的用法: 1)配合if语句 if a>b: print(a) else: print(b) 2)配合while和for循环 只在循环完成后才执行,如果循环中执行使用到brea ...
- Linux高阶命令进阶
1. 输出重定向 > (1>):覆盖输出,会覆盖掉原先的文件内容 >> (1>>) :追加输出,不会覆盖原始文件内容,会在原始内容末尾继续添加 2> :错误输 ...
- PHP条件运算符的“坑”
今天遇到一个关于PHP 嵌套使用条件运算符(ternary expressions)的问题 现象 先来看一段C语言代码(test.c): #include<stdio.h> int mai ...
- jQuery实现上传进度条效果
效果:(点击上传按钮) See the Pen pjGNJr by moyu (@MoYu1991) on CodePen. html代码: <!DOCTYPE html> <h ...