Android开发之Android.mk模板的实例详解

作者:Jhuster 时间:2022-02-20 09:11:44 

Android开发之Android.mk模板的实例详解

关于Android NDK开发的文章已经比较多了,我的博客中也分享了很多NDK开发相关经验和技巧,今天简单写了一个 Android.mk 的示例模板,供初学者参考。

  本模板主要给大家示例 Android NDK 开发中的如下几个问题:

  1. 如何自动添加需要编译的源文件列表
  2. 如何添加第三方静态库、动态库的依赖
  3. 如何构造一个完整的NDK工程框架

  假设我们的项目依赖 libmath.a, libjson.a, libffmpeg.so 这几个第三方库文件,项目包含如下几个模块:algorithm,core,network,utils,tests,每个模块都有若干个.c/.h文件,我们要把整个工程编译为动态库,并通过 native_sdk.c 中的函数向Java层提供调用接口。

  那么,我们可以对 Android 工程的 jni 目录,做如下划分:

  Android开发之Android.mk模板的实例详解

  对应的 Android.mk 文件的写法示例如下(注:工程文件可以到我的Github(@Jhuster/Android)中在线查看,也可以在本博文最后的附件中下载):


LOCAL_PATH := $(call my-dir)
3RD_INC_DIR = $(LOCAL_PATH)/3rd/inc
3RD_LIB_DIR = $(LOCAL_PATH)/3rd/libs

# Prebuild the 3rd libraries

include $(CLEAR_VARS)
LOCAL_MODULE := math
LOCAL_SRC_FILES := $(3RD_LIB_DIR)/libmath.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := json
LOCAL_SRC_FILES := $(3RD_LIB_DIR)/libjson.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := ffmpeg
LOCAL_SRC_FILES := $(3RD_LIB_DIR)/libffmpeg.so
include $(PREBUILT_SHARED_LIBRARY)

# Build native sdk

include $(CLEAR_VARS)  

LOCAL_MODULE := native_sdk

LOCAL_SRC_FILES := \
 $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/src/algorithm/*.c)) \
 $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/src/core/*.c)) \
 $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/src/network/*.c)) \
 $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/src/utils/*.c)) \
 $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/src/*.c))

LOCAL_C_INCLUDES := $(3RD_INC_DIR)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/src
LOCAL_C_INCLUDES := $(LOCAL_PATH)/src/algorithm
LOCAL_C_INCLUDES += $(LOCAL_PATH)/src/core
LOCAL_C_INCLUDES += $(LOCAL_PATH)/src/network
LOCAL_C_INCLUDES += $(LOCAL_PATH)/src/utils

LOCAL_CFLAGS := -DANDROID                  
LOCAL_LDLIBS := -llog

LOCAL_STATIC_LIBRARIES := math json
LOCAL_SHARED_LIBRARIES := ffmpeg

include $(BUILD_SHARED_LIBRARY)

# Build tests

include $(CLEAR_VARS)  
LOCAL_MODULE := test.out
LOCAL_SRC_FILES := $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/tests/*.c))
LOCAL_CFLAGS := -DANDROID
LOCAL_C_INCLUDES := $(LOCAL_PATH)/src
LOCAL_LDLIBS := -llog -fPIE -pie
LOCAL_SHARED_LIBRARIES:= native_sdk
include $(BUILD_EXECUTABLE)

  对于 Android.mk 而言,如果要依赖第三方库文件,则必须添加 PREBUILT_XXXX_LIBRARY 进行预编译,LOCAL_SRC_FILES 宏给出了需要编译的源文件列表,这里我通过 subst和wildcard 这两个函数,实现了自动扫描指定目录下的源文件,最后,通过 BUILD_EXECUTABLE 编译出可以运行于adb shell命令行的可执行程序,用于做代码的单元测试。

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

来源:http://ticktick.blog.51cto.com/823160/1733500

标签:Android.mk,模板
0
投稿

猜你喜欢

  • C#开发微信公众号接口开发

    2023-10-14 11:49:01
  • 详谈java中int和Integer的区别及自动装箱和自动拆箱

    2023-01-18 23:25:20
  • 基于Retrofit2+RxJava2实现Android App自动更新

    2021-09-04 20:19:29
  • android图片转换器示例

    2022-02-16 14:27:01
  • java easyUI实现自定义网格视图实例代码

    2022-05-16 23:52:54
  • Java详细讲解堆排序与时间复杂度的概念

    2023-10-20 02:00:11
  • Unity实现滑动更换界面效果

    2021-10-06 19:56:40
  • Spring 容器初始化 register 与 refresh方法

    2021-09-19 21:20:56
  • Android利用OpenGLES绘制天空盒实例教程

    2023-11-19 16:07:27
  • java金钱处理方法实例详解

    2023-05-29 10:38:29
  • 浅析C++字节对齐容易被忽略的两个问题

    2022-06-02 20:29:59
  • Java IO之序列化与反序列化详解

    2023-05-21 14:59:14
  • Android仿支付宝微信支付密码界面弹窗封装dialog

    2021-10-24 13:13:31
  • java前后端加密解密crypto-js的实现

    2023-11-29 12:09:31
  • Android串口开发之使用JNI实现ANDROID和串口通信详解

    2023-12-02 17:17:01
  • android实现简单音乐播放器

    2021-06-28 22:07:26
  • Android不显示开机向导和开机气泡问题

    2022-10-13 23:56:26
  • Lucene实现索引和查询的实例讲解

    2022-09-06 16:35:30
  • springboot拦截器Interceptor的使用,你都了解吗

    2023-01-01 21:53:40
  • 安卓监听屏幕的横竖翻转实现方法

    2023-04-01 07:37:12
  • asp之家 软件编程 m.aspxhome.com