Android编程使用NDK必须创建一个jni文件夹,并且jni文件里一般包含有C/C++的源码文件、Android..mk文件、Application.mk文件(可选),Android.mk文件的编写是重点。 Android.mk文件学习Android.mk文件告诉编译器将C/C++的源码文件编译成动态库、静态库或者可执行程序,具体的可以参考android-ndk-r9\docs下的文档ANDROID-MK.html。BUILD_SHARED_LIBRARY             编译成动态库BUILD_STATIC_LIBRARY                编译成静态库BUILD_EXECUTABLE                      编译生成标准可执行程序 标准的Android.mk文件的实例:#必须以LOCAL_PATH变量开头LOCAL_PATH := $(call my-dir) #清除变量include $(CLEAR_VARS) #生成模块的名称LOCAL_MODULE    := hello# C /C++源码LOCAL_SRC_FILES := hello.cpp #编译生成动态共享库include $(BUILD_SHARED_LIBRARY)++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++1.      构建多个动态共享库一个单独的Android.mk文件可以产生多个共享库模块,在Android.mk文件中定义多个模块即可。#必须以LOCAL_PATH变量开头LOCAL_PATH := $(call my-dir) ##模块1# #清除变量include $(CLEAR_VARS) #生成模块1的名称LOCAL_MODULE    := hello1#C++源码LOCAL_SRC_FILES := hello1.cpp #编译生成共享库include $(BUILD_SHARED_LIBRARY) ##模块2# #清除变量include $(CLEAR_VARS) #生成模块2的名称LOCAL_MODULE    := hello2#C++源码LOCAL_SRC_FILES := hello2.cpp #编译生成共享库include $(BUILD_SHARED_LIBRARY) #产生两个.so动态库文件即hello1.so和hello2.so++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++2.      构建静态库在Android应用程序中很少直接使用静态库,静态库一般是用来构建动态共享库,比如将第三方代码编译成静态库然后并入共享库。#必须以LOCAL_PATH变量开头。LOCAL_PATH := $(call my-dir) ##第三方模块AVI库# #清除变量include $(CLEAR_VARS) #生成模块的名称LOCAL_MODULE    := avilib#C源码LOCAL_SRC_FILES := avilib.cpatform.c #编译生成静态库include $(BUILD_STATIC_LIBRARY) ################################################################### ##原生模块# #清除变量include $(CLEAR_VARS)      #生成模块的名称LOCAL_MODULE    := hello#C源码LOCAL_SRC_FILES := hello.c #引用第三方静态库avilibLOCAL_STATIC_LIBRARIES := avilib #编译生成共享库include $(BUILD_SHARED_LIBRARY)++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++3.      用共享库构建通用模块当多个共享库与同一个静态库连接时,静态库会产生多个副本,会增加应用程序的大小;因此最好将其编译成动态共享库库,供多个共享库调用。#必须以LOCAL_PATH变量开头LOCAL_PATH := $(callmy-dir) ##第三方模块AVI库# #清除变量include $(CLEAR_VARS) #生成模块的名称LOCAL_MODULE    := avilib#C源码LOCAL_SRC_FILES := avilib.cpatform.c #编译生成动态共享库include $(BUILD_SHARED_LIBRARY) ################################################################### ##原生模块1# #清除变量include $(CLEAR_VARS) #生成模块的名称LOCAL_MODULE    := hello1#C源码LOCAL_SRC_FILES := hello1.c #引用第三方动态共享库avilibLOCAL_SHARED_LIBRARIES := avilib #编译生成动态共享库include $(BUILD_SHARED_LIBRARY) ##原生模块2# #清除变量include $(CLEAR_VARS) #生成模块的名称LOCAL_MODULE    := hello2#C源码LOCAL_SRC_FILES := hello2.c #引用第三方动态共享库avilibLOCAL_SHARED_LIBRARIES := avilib #编译生成动态共享库include $(BUILD_SHARED_LIBRARY)++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++4.      使用Prebuilt库前面的三种库文件的调用都有一个要求:必须将C/C++源码文件包含在NDK项目工程中,自R3以后Android的NDK提供了对Prebuilt库的支持,不需要源码文件就可以发布你的模块给他人使用。预构建共享库模块的Android.mk文件#必须以LOCAL_PATH变量开头LOCAL_PATH := $(call my-dir) ##第三方预构建AVI库# #清除变量include $(CLEAR_VARS) #生成模块的名称LOCAL_MODULE    := avilib#预构建so库LOCAL_SRC_FILES := libavilib.so #编译生成动态共享库include $(PREBUILD_SHARED_LIBRARY)使用Prebuilt共享库LOCAL_SHARED_LIBRARIES := avilib说明:还可以编译成PREBUILT_STATIC_LIBRARY类型的Prebuilt静态库++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++5.      构建独立的可执行文件为方便测试和快速原型设计,AndroidNDK支持编译生成独立的可执行文件,不需要打包成APK文件,就可以复制到Android设备中作为Linux应用程序直接执行。#必须以LOCAL_PATH变量开头LOCAL_PATH := $(call my-dir) ##模块# #清除变量include $(CLEAR_VARS) #生成模块1的名称LOCAL_MODULE    := hello#C++源码LOCAL_SRC_FILES := hello.cpp #编译生成可执行文件include $(BUILD_EXECUTABLE)++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++6.      在多个NDK项目间共享模块共享avilib文件的Android.mk文件#必须以LOCAL_PATH变量开头LOCAL_PATH := $(call my-dir) ##第三方AVI库# #清除变量include $(CLEAR_VARS) #生成模块的名称LOCAL_MODULE    := avilib#C源码LOCAL_SRC_FILES := avilib.c  patform.c #编译生成静态库include $(BUILD_SHARED_LIBRARY) 使用共享模块的NDK项目工程##原生模块# #清除变量include $(CLEAR_VARS) #生成模块的名称LOCAL_MODULE    := hello#C源码LOCAL_SRC_FILES := hello.c #引用第三方动态共享库avilibLOCAL_SHARED_LIBRARIES := avilib #编译生成共享库include $(BUILD_SHARED_LIBRARY) $(call  import-module,transcode/avilib)为了避免冲突,应该将import-module函数宏放在Android.mk文件的末尾。import-module函数宏默认只搜索<Android  NDK>/sources目录,为了让它搜索其他的目录必须设置环境变量NDK_MOUDLE_PATH值为要搜索的目录路径。++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++7.      条件操作在Android.mk文件中也可以有条件操作,例如在每个体系结构中包含不同源文件:...ifeq($(TARGET_ARCH),arm)LOCAL_SRC_FILES + = armonly.celseLOCAL_SRC_FILES + = generic.cendif... Application.mk文件学习Application.mk文件是AndroidND构建系统使用的可选构建文件。它的目的是描述应用程序需要那些模块;它也定义所有模块的通用变量。Application.mk文件的例子:#APP_ABI默认为armeabi可以更改,ABI生成二进制文件#APP_ABI := armeabi mips也可以是多个#APP_ABI := all 为所有支持的ABI生成二进制文件APP_ABI := armeabi#生成程序运行支持的平台APP_PLATFORM := android-8 #对STL的支持APP_STL := stlport_static #对异常的支持APP_CPPFLAGS += -fexceptions #对RTTI的支持APP_CPPFLAGS += -frtti 对Application.mk文件具体的信息可以仔细阅读android-ndk-r9\docs下的文档APPLICATION-MK.html。


更多相关文章

  1. android 自定义权限 permission
  2. Android(安卓)破解apk文件
  3. 如何用Android(安卓)源码生成APK签名文件
  4. Android中的文件存储数据方式 .
  5. Android(安卓)Studio 引入编写好的.so库
  6. 给 Android(安卓)开发者的 Flutter 指南(上)
  7. 基于 Android(安卓)NDK 的学习之旅-----Android.mk 介绍
  8. android 菜单导航 (Fragment + RadioGroup)
  9. Android(安卓)10适配注意的问题

随机推荐

  1. Android 设备管理
  2. Android ADT Bundle 0917,SDK Tools r22.2
  3. Android Activity getCurrentFocus()
  4. android Notification 工具类
  5. Android=》Nitification
  6. android 用代码画圆
  7. Android JNI开发
  8. android AOP编程
  9. android studio 关闭log 打印
  10. Android: Listen outgoing/incoming call