本文不作为ndk初学使用,只是对cpp等c++文件编译成so文件的过程中,参数含义,及ndk配置的解释。使用的技术比较旧。

androidStudio使用gradle调用ndk-build工具编译c++代码,

使用ndk-build来进行编译,而不是使用最新版本的cmake工具

在gradle配置的参数最后都是调用ndk-build命令去执行Android.mk和Application.mk文件

Android.mk文件指定需要编译的c或c++文件

Application.mk文件用来描述应用程序需要的模块,需要生成的.so文件

commandLine "$ndkDir/ndk-build.cmd", "NDK_PROJECT_PATH=$projectDir.absolutePath\\build",

"APP_BUILD_SCRIPT=$projectDir.absolutePath\\src\\main\\jni\\Android.mk",

"NDK_APPLICATION_MK=$projectDir.absolutePath\\src\\main\\jni\\Application.mk"

build.gradle配置参数

也就是在执行jni/Android.mk文件进行编译时需要用到的环境变量

build.gradle

defaultConfig {

。。。

externalNativeBuild {

ndkBuild {

targets 'cocos2djs'

arguments 'NDK_TOOLCHAIN_VERSION=4.9'

arguments 'APP_PLATFORM=android-19'

arguments 'NDK_MODULE_PATH=cocos2d-x;cocos2d-x/cocos;cocos2d-x/external'

arguments '-j' + Runtime.runtime.availableProcessors()

abiFilters.addAll(['armeabi-v7a'])

}

}

}

externalNativeBuild {

ndkBuild {

if (!project.hasProperty("PROP_NDK_MODE") || PROP_NDK_MODE.compareTo('none') != 0) {

// skip the NDK Build step if PROP_NDK_MODE is none

path "jni/Android.mk"

}

}

}

使用targets指定我们编译的模块,其实就是指定只执行哪个Android.mk文件,这个是跟path 指定的路径jni/Android.mk相匹配的

jni/Android.mk文件中已经定义的模块名

LOCAL_MODULE := cocos2djs_shared

LOCAL_MODULE_FILENAME := libcocos2djs

最后输出的so文件是libcocos2djs.so   也可以不加lib前缀,ndk会自动添加前缀。这个模块名就是cocos2djs,也就是上面我们指定的targets:cocos2djs

如果修改了这个targets 'zwhcocos2djs',则会报错。Valid values are:这句后面的都是查找到的所有模块名

> Unexpected native build target zwhcocos2djs. Valid values are: extension, creator, audioengine, cpufeatures, cocos2dandroid, spine, vorbisidec, network, cocos2djs, dragonbones, jscocos2d, ui, cocos2dxinternal,

使用arguments来定义ndk的运行时用到的环境变量值

arguments 'NDK_TOOLCHAIN_VERSION=4.9'

NDK_TOOLCHAIN_VERSION=4.9 配置ndk使用的gcc编译工具版本

APP_PLATFORM=android-19 设置android平台版本

NDK_MODULE_PATH=cocos2d-x;cocos2d-x/cocos;cocos2d-x/external

arguments '-j' + Runtime.runtime.availableProcessors()

这个-j参数后面是得到处理器的数量。指定使用多少个处理器进行ndk的编译

abiFilters.addAll(['armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64', 'mips', 'mips64'])

用来设置ndk需要编译的cpu架构,一般来说只需要armeabi-v7a,arm64-v8a,x86这三个cpu架构

path "jni/Android.mk"

设置要运行的mk文件路径

NDK_MODULE_PATH是用来设置模块的路径,在windows系统上使用分号;在非windows系统上使用冒号:分隔不同的ndk模块路径

会在Android.mk中调用执行其他模块的android.mk文件时使用

$(call import-module, scripting/js-bindings/proj.android)

执行上面代码时,会查找上面的模块路径,如果存在这个$modulePath/scripting/js-bindings/proj.android/Android.mk文件,则会执行这个文件。

所有模块路径下都找不到文件时,则会报错Are you sure your NDK_MODULE_PATH variable is properly defined。

jni/ Android.mk代码

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := cocos2djs_shared

LOCAL_MODULE_FILENAME := libcocos2djs

ifeq ($(USE_ARM_MODE),1)

LOCAL_ARM_MODE := arm

endif

LOCAL_SRC_FILES := hellojavascript/main.cpp \

../../../Classes/AppDelegate.cpp \

../../../Classes/jsb_module_register.cpp \

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../Classes

ifeq ($(USE_ANY_SDK),1)

LOCAL_SRC_FILES += ../../../Classes/anysdk/SDKManager.cpp \

../../../Classes/anysdk/jsb_anysdk_basic_conversions.cpp \

../../../Classes/anysdk/manualanysdkbindings.cpp \

../../../Classes/anysdk/jsb_anysdk_protocols_auto.cpp

LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../../Classes/anysdk

LOCAL_WHOLE_STATIC_LIBRARIES := PluginProtocolStatic

endif

LOCAL_STATIC_LIBRARIES := cocos2d_js_static

LOCAL_EXPORT_CFLAGS := -DCOCOS2D_DEBUG=2 -DCOCOS2D_JAVASCRIPT

include $(BUILD_SHARED_LIBRARY)

$(call import-module, scripting/js-bindings/proj.android)

上面代码的意思是使用LOCAL_SRC_FILES指定的cpp文件 作为编译模块的源文件,也就是说ndk会编译这些cpp文件,然后聚合到一个模块中。

最后一行是查找在gradle中定义NDK_MODULE_PATH路径中查找相对路径为scripting/js-bindings/proj.android/Android.mk文件,并执行这个Android.mk文件

然后这个proj.android下的文件mk文件会继续调用cocos文件夹下的mk文件,调用,调用,调用!。最后c++或c代码就编译完成了。

Application.mk目的是描述在你的应用程序中所需要的模块,这是一个可选文件,规定怎么编译so文件

比如,设置编译的模式debug或者release

使用这个变量设置编译模式APP_OPTIM := release  默认是release模式

--------------- 越长大越无知

〖Linux〗Clang/Clang++ for Android Binary/NDK build(二进制可执行文件/NDK编译)

#1. 下载并安装NDK(解压即可,目前最新版是r9c) http://developer.android.com/tools/sdk/ndk/index.html #2. 安装NDK独立编译工具 c ...

Android学习——NDK交叉编译

原创作品,转载请注明出处,严禁非法转载.如有错误,请留言! email:40879506@qq.com 一. 环境1.GNU/Linux Ubuntu12.04操作系统(x86) 二. 下载NDK安装 ...

ndk,cygwin编译 .so动态库

注意: ndk .cygwin 安装路径尽量要和sdk放到一个磁盘里,设置环境变量. 例如D: 根目录  变量名:ndk   值:/cygdrive/d/android-ndk-r8e 打开cygwi ...

Android学习笔记02-Mac下编译java代码

在Mac OS上配置JDK 1.7. 一 下载 Mac版本的JDK1.7 从以下下载地址,下载Mac版本的JDk1.7 安装文件 jdk-7u79-macosx-x64.dmg. http://www ...

Android学习之两款下拉刷新库分享

昨天没有写博客.心里非常罪过呀,今天给大家写两种比較常见的下拉刷新的用法.一款是SwipeRefreshLayout,一款是CircleRefreshLayout. SwipeRefreshLayou ...

ArcGIS学习记录—dbf shp shx sbn sbx mdb adf等类型的文件的解释

android.mk 冒号,android学习-ndk-build(androidstudio编译cocos2d-x库的cpp为so文件的解释)相关推荐

  1. Android 编译过程介绍,Android.mk 和 Android.bp 分析, 在源码中编译 AndroidStudio 构建的 App

    目录 一.Android 编译 1. 编译流程 2. Soong 介绍 3. build.sh 二.Android.mk 解析 三.Android.bp 解析 1. 模块类型 2. 模块属性 四.An ...

  2. android.mk转换为android.bp

    1.0 类似例子 android.mk大家都很熟悉了,就是android下编译模块的配置文件,可以理解为android makefile.从android N之后,我们发现好多模块下面没有了andro ...

  3. oracle如何往dg加盘_学习笔记:Oracle DG系统 主备库中表空间和数据文件增加删除等管...

    天萃荷净 Oracle Data Guard表空间和数据文件管理汇总 汇总日常工作中操作,在Oracle DG结构系统中,如何删除备库表空间和数据文件,如何管理主库与备库之间的文件系统,详见文章内容. ...

  4. android.mk 条件编译,android openSSL 的苦逼历程

    20180801 调试 Socket 1.按照以前的环境设置,出错了! cd /Users/dhbm/Desktop/lxn/lxntransfer/tests openssl s_server -k ...

  5. 【Android.mk】android编译系统makefile文件Android.mk的写法

    (1)Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件.由于一般情况下 Android.mk和需要编译的源文件在同一目录下,所以定义成如下形式: LOCAL_PATH:=$ ...

  6. android 静态编译链接,Android NDK:使用预编译的静态库链接

    我正在尝试将Jnetpcap移植到Android,以便将其用于解析.pcap文件.Jnetpcap是libpcap的java包装器,它使用JNI.我已经使用android的源代码树将libpcap编译 ...

  7. android.mk local_cppflags,android.mk中LOCAL_CFLAGS 介绍

    模块描述变量: 下面的变量用于向编译系统描述你的模块.你应该定义在'include $(CLEAR_VARS)'和'include $(BUILD_XXXXX)'之间定义.正如前面描写的那样,$(CL ...

  8. Android.mk 分析android buid工程需要的makefile知识点总结

    1.0 make -C /home/wangxiancan/android -f build/core/main.mk all_modules -C 表示进入到某目录 执行(解析)其中的makefil ...

  9. 编写Android.mk把Android studio项目编译到AOSP源码中

    前言: 在工作,我们利用Android studio开发apk是非常方便的,当我们要把工程代码放在android 源码中编译的时候,需要我们自己编写Andorid.mk 文件.以下内容是对Androi ...

最新文章

  1. 关于 CPU 的一些基本知识总结
  2. ViewPager实现翻页步骤
  3. [转] 利用jemalloc分析内存泄漏
  4. SurfaceView、GLSurfaceView、SurfaceTexture、TextureView简单对比
  5. 【bzoj2242】[SDOI2011]计算器 EXgcd+BSGS
  6. Ubuntu下git使用教程
  7. 【C++拾遗】 从内存布局看C++虚继承的实现原理
  8. druid连接池初始化慢_从零开始手写 mybatis (三)jdbc pool 从零实现数据库连接池
  9. c# emnu 获取注释_C# 数据操作系列 - 19 FreeSql 入坑介绍
  10. 文件服务器 远程访问,远程访问文件服务器
  11. 病毒注册表常用目标Svchost和Explorer
  12. ansys的kbc_ANSYS载荷施加
  13. [HNOI2014]世界树
  14. 怎么把ide改成ahci_怎么IDE改成AHCI
  15. ICCV2021 多目标跟踪(MOT)汇总
  16. win7计算机闪屏,win7电脑闪屏是什么原因
  17. 基于金字塔模型的自动化测试设计
  18. 计算机cpu对什么访问最快,CPU直接访问的存储器是什么?
  19. 舆情监控系统计算机 书籍,网络舆情监测系统方案建议书.doc
  20. Github:this exceeds GitHub‘s file size limit of 100.00 MB

热门文章

  1. 追踪广告效果保护用户隐私 —— 隐私集合交集算法可以得兼
  2. 【论文】基于特定实体的文本情感分类总结(PART II)
  3. 概率图模型笔记(一)开坑
  4. threejs 形状几何体_ThreeJS学习笔记(五)——二维几何体元素及穿梭动画
  5. 集成学习——NGBoost论文研读与原理理解
  6. c++中queue用法
  7. TensorFlow2.0:数据的填充与复制
  8. Redis基础(十二)——缓存读写策略
  9. Linux编程(6)_makefile
  10. Rainbond 5.0正式发布, 支持对接管理已有Kubernetes集群...