Android.mk(5) 计算怎么办?

https://www.jianshu.com/p/57c01e97c9b8

 

计算怎么办?

前面我们把Makefile做为一门语言的主要特性大致做了一个描述,它集合了目标式的模式和函数式的模式,还有大量的宏的思想,已经可以写出相当复杂的Makefile了。
但是,很不幸的是,虽然已经很复杂了,我们在实际的Android.mk当中还是会发现有很多事情光用Makefile的字符串替换搞不定啊,这可如何是好?

其实,这就是我们在第一讲的最开始就讲shell函数的原因,因为这要靠shell脚本来解决了。

我们看个实际的例子:core.mk中判断make的版本号大于等于3.81版的脚本:

# Check for broken versions of make.
# (Allow any version under Cygwin since we don't actually build the platform there.)
ifeq (,$(findstring CYGWIN,$(shell uname -sm))) ifneq (1,$(strip $(shell expr $(MAKE_VERSION) \>= 3.81))) $(warning ********************************************************************************) $(warning * You are using version $(MAKE_VERSION) of make.) $(warning * Android can only be built by versions 3.81 and higher.) $(warning * see https://source.android.com/source/download.html) $(warning ********************************************************************************) $(error stopping) endif endif 

计算表达式的值 - expr语句

expr语句可以用来计算变量计算结果的值。

  • 加法:+
  • 减法:-
  • 乘法:\*
  • 除法:/
  • 求余数: %

特别注意一下乘法,要在*之前加一个\

取消变量的定义 - unset语句

在实际写Makefile的过程中,有时候需要修改环境变量。shell中提供了unset语句

不多说,直接上例子:

java_version_str := $(shell unset _JAVA_OPTIONS && java -version 2>&1)
javac_version_str := $(shell unset _JAVA_OPTIONS && javac -version 2>&1)

shell也搞不定怎么办?

shell总算是可以做些简单的计算了,但是对于规模到一定程度的需求,还是搞不定,怎么办?
在Android.mk系统中,您可以看到python,ruby纷纷被引进来了,需要用的话,别客气。完成工作是主要的,方法不重要。



作者:Jtag特工
链接:https://www.jianshu.com/p/57c01e97c9b8
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

转载于:https://www.cnblogs.com/onelikeone/p/8438275.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android.mk文件Android编译系统使用的构建脚本之一,它描述了如何构建一个Android应用程序或者一个Android库。Android.mk文件使用makefile语法,可以通过定义一系列的规则来指定编译过程中需要执行的命令。 要预编译一个可执行程序,可以在Android.mk文件中添加以下规则: ```makefile # 编译可执行程序 include $(CLEAR_VARS) LOCAL_MODULE := myexecutable LOCAL_SRC_FILES := myexecutable.c include $(BUILD_EXECUTABLE) ``` 这个规则定义了一个名为myexecutable的可执行程序,其源代码位于myexecutable.c文件中。通过调用BUILD_EXECUTABLE规则,构建系统将自动编译和链接该程序,并将其放置在输出目录中。 要在Android应用程序中使用该可执行程序,可以在应用程序的Android.mk文件中添加以下规则: ```makefile # 添加可执行程序依赖 include $(CLEAR_VARS) LOCAL_MODULE := myapp LOCAL_SRC_FILES := myapp.c LOCAL_SHARED_LIBRARIES := libmyexecutable include $(BUILD_SHARED_LIBRARY) # 引用可执行程序 include $(CLEAR_VARS) LOCAL_MODULE := libmyexecutable LOCAL_SRC_FILES := myexecutable.c include $(BUILD_EXECUTABLE) ``` 这个规则定义了一个名为myapp的Android应用程序,其源代码位于myapp.c文件中。该应用程序依赖于名为libmyexecutable的共享库,而该共享库实际上是我们之前定义的myexecutable可执行程序。因为我们将myexecutable编译为可执行程序,而不是共享库或静态库,所以我们需要将其转化为共享库,以便在Android应用程序中使用。最后,我们需要在Android.mk文件中引用myexecutable可执行程序,以便将其编译为共享库。 在Android应用程序中使用预编译的可执行程序可以提高应用程序的性能和可维护性,因为我们可以将一些计算密集型的操作委托给预编译的可执行程序来处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值