最近在移植一个linux下的c库到android,学习编写Android.mk文件,特地花了点时间学习。
在网上搜了很多,最后发现还是看ndk的文档最直接,也最全面,下面的总结主要是根据ndk提供的文档编写的。
1、单一的Android.mk文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH必须位于Android.mk文件的最开始。它是用来定位源文件的位置,$(call my-dir)的作用就是返回当前目录的路径。
include $(CLEAR_VARS)的作用是清除一些变量的值,但是LOCAL_PATH除外。
LOCAL_MODULE是用来指定当前待编译模块的名称,在示例中的模块名称为hello-jni
LOCAL_SRC_FILES是用来指定参与编译的源代码文件。这里只编译hell0-jin.c
include $(BUILD_SHARED_LIBRARY)是用来指示将当前模块编译为共享库,前缀为lib,后缀为.so。
还有另外一个BUILD_STATIC_LIBRARY,是用来指示将当前模块编译为静态库的,前缀为.a,后缀为.a。
这就是一个最简单的Android.mk的结构。可能还有另外一点需要介绍:
LOCAL_C_INCLUDES:=include 这个是用来指定在编译时即将使用的c头文件的位置,以当前目录为起点。
2、定义多个Android.mk文件。
有的时候,需要编译的模块比较多,我们可能会将对应的模块放置在相应的目录中,这样,我们可以在每个目录中定义对应的Android.mk文件(类似于上面的写法),最后,在根目录放置一个Android.mk文件,内容如下:
include $(call all-subdir-makefiles)
只需要这一行就可以了,它的作用就是包含所有子目录中的Android.mk文件
3、也可以在一个Android.mk文件里包含多个模块。
很直观的想法就是将第一个Android.mk文件的内容复制一份,然后修改。我最开始也是这样做的,但是后来出现问题了,在第二个模块中的源码找不到,最后还是看文档,发现里面已经有示例解释了:
LOCAL_PATH := $(call my-dir)
IMPORTANT NOTE: Due to the way GNU Make works, this really returns
the path of the *last* *included* *Makefile* during the parsing of
build scripts. Do not call my-dir after including another file.
大意是:基于GNU make的工作方式,$(call my-dir)会返回在解析build脚本时,遇到的最后一个 include中涉及的目录。
所以,很多时候,在这个Android.mk里面只需要调用一次$(call my-dir)就够了,如果所有的源文件都在一个目录中。
如果需要的话,可以在第一次调用call my-dir的时候,将值保存下来,比如:
MY_LOCAL_PATH := $(call my-dir)
LOCAL_PATH := $(MY_LOCAL_PATH)
然后,在另外一个模块中,继续如下定义:
LOCAL_PATH := $(MY_LOCAL_PATH)
在编译一般的c源代码时,上面的基本可以满足了,等后面需要,再继续补充吧!
- 浏览: 68057 次
- 性别:
- 来自: 深圳
最新评论
-
andy_叶:
hold_on 写道有 android proguard 语法 ...
android源码中混淆编译 -
hold_on:
有 android proguard 语法文档吗?google ...
android源码中混淆编译
相关推荐
android adt自带eclipse无法设置ndk路径,需要下载com.android.ide.eclipse.ndk_23.0.2.1259578.jar文件,然后复制到sdk 只带的eclipse目录的“plugins”下面,如我的复制到"D:\Android\adt-bundle-windows-x86_64-...
这个虽然只是个简单的jnidemo、但是涵盖了Android.mk 和Application.mk 的原理 重点是Android NDK编译的理解 mac 系统下 切换到jni目录,然后呢个 ndk-build
opus NDK 编译 Android.mk文件 仅供参考
android.mk文件语法详述及简单实例
解决eclipse无NDK选项设置问题。复制到eclipse目录的“plugins”下面。如我的复制到"\eclipse\plugins\com.android.ide.eclipse.ndk_23.0.2.1259578.jar"
Android.NDK.Beginners.Guide.2nd.Edition
android ndk+jni开发,两种方式cmake编译,和用application.mk使用ndk-build编译
NDK的android.mk文件的详解。
Packtpub.Android.NDK.Beginners.Guide.Jan.2012.rar
Android.mk语法说明(android ndk开发),ndk开发必知必会!
android-ndk-r5-linux-x86.tar.tar android-ndk-r5-linux-x86.tar.tar
android-ndk(android-ndk-r25b-linux.zip)适用于Linux系统
ffmpeg ndk编译目录结构以及Android.mk, 使用MingW与Cygwin编译均可,需要根据config.sh设置NDK的安装目录
ndk编译JRTPLIB源文件(包括相应的Android.mk和Application.mk文件) 使用cygwin+NDK可直接编译通过 相关cygwin命令,文件夹放在c盘上 cd /cygdrive/c/jrtp export NDK_MODULE_PATH=/cygdrive/c/jrtp /cygdrive/c...
android-ndk(android-ndk-r26b-windows.zip)适用于Windows系统
Packt.Android.NDK.Beginners.Guide.2nd.Edition.1783989645
Time for action – installing Android SDK and NDK on Windows Setting up Mac OS X Time for action – preparing Mac OS X for Android development Installing Android development kits on Mac OS X Time ...
android ndk编程实例,含Android.mk语法注释,如何打包多个so,如何移植到x86平台
Packt.Android.NDK.Beginner's.Guide.2012
这是Android NDK开发标准的JNI和Android.mk编写模版,里面的一些东西可能涉及我的项目,但不影响观看