android.mk 冒号,android学习-ndk-build(androidstudio编译cocos2d-x库的cpp为so文件的解释)
本文不作为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文件的解释)相关推荐
- Android 编译过程介绍,Android.mk 和 Android.bp 分析, 在源码中编译 AndroidStudio 构建的 App
目录 一.Android 编译 1. 编译流程 2. Soong 介绍 3. build.sh 二.Android.mk 解析 三.Android.bp 解析 1. 模块类型 2. 模块属性 四.An ...
- android.mk转换为android.bp
1.0 类似例子 android.mk大家都很熟悉了,就是android下编译模块的配置文件,可以理解为android makefile.从android N之后,我们发现好多模块下面没有了andro ...
- oracle如何往dg加盘_学习笔记:Oracle DG系统 主备库中表空间和数据文件增加删除等管...
天萃荷净 Oracle Data Guard表空间和数据文件管理汇总 汇总日常工作中操作,在Oracle DG结构系统中,如何删除备库表空间和数据文件,如何管理主库与备库之间的文件系统,详见文章内容. ...
- android.mk 条件编译,android openSSL 的苦逼历程
20180801 调试 Socket 1.按照以前的环境设置,出错了! cd /Users/dhbm/Desktop/lxn/lxntransfer/tests openssl s_server -k ...
- 【Android.mk】android编译系统makefile文件Android.mk的写法
(1)Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件.由于一般情况下 Android.mk和需要编译的源文件在同一目录下,所以定义成如下形式: LOCAL_PATH:=$ ...
- android 静态编译链接,Android NDK:使用预编译的静态库链接
我正在尝试将Jnetpcap移植到Android,以便将其用于解析.pcap文件.Jnetpcap是libpcap的java包装器,它使用JNI.我已经使用android的源代码树将libpcap编译 ...
- android.mk local_cppflags,android.mk中LOCAL_CFLAGS 介绍
模块描述变量: 下面的变量用于向编译系统描述你的模块.你应该定义在'include $(CLEAR_VARS)'和'include $(BUILD_XXXXX)'之间定义.正如前面描写的那样,$(CL ...
- Android.mk 分析android buid工程需要的makefile知识点总结
1.0 make -C /home/wangxiancan/android -f build/core/main.mk all_modules -C 表示进入到某目录 执行(解析)其中的makefil ...
- 编写Android.mk把Android studio项目编译到AOSP源码中
前言: 在工作,我们利用Android studio开发apk是非常方便的,当我们要把工程代码放在android 源码中编译的时候,需要我们自己编写Andorid.mk 文件.以下内容是对Androi ...
最新文章
- 关于 CPU 的一些基本知识总结
- ViewPager实现翻页步骤
- [转] 利用jemalloc分析内存泄漏
- SurfaceView、GLSurfaceView、SurfaceTexture、TextureView简单对比
- 【bzoj2242】[SDOI2011]计算器 EXgcd+BSGS
- Ubuntu下git使用教程
- 【C++拾遗】 从内存布局看C++虚继承的实现原理
- druid连接池初始化慢_从零开始手写 mybatis (三)jdbc pool 从零实现数据库连接池
- c# emnu 获取注释_C# 数据操作系列 - 19 FreeSql 入坑介绍
- 文件服务器 远程访问,远程访问文件服务器
- 病毒注册表常用目标Svchost和Explorer
- ansys的kbc_ANSYS载荷施加
- [HNOI2014]世界树
- 怎么把ide改成ahci_怎么IDE改成AHCI
- ICCV2021 多目标跟踪(MOT)汇总
- win7计算机闪屏,win7电脑闪屏是什么原因
- 基于金字塔模型的自动化测试设计
- 计算机cpu对什么访问最快,CPU直接访问的存储器是什么?
- 舆情监控系统计算机 书籍,网络舆情监测系统方案建议书.doc
- Github:this exceeds GitHub‘s file size limit of 100.00 MB
热门文章
- 追踪广告效果保护用户隐私 —— 隐私集合交集算法可以得兼
- 【论文】基于特定实体的文本情感分类总结(PART II)
- 概率图模型笔记(一)开坑
- threejs 形状几何体_ThreeJS学习笔记(五)——二维几何体元素及穿梭动画
- 集成学习——NGBoost论文研读与原理理解
- c++中queue用法
- TensorFlow2.0:数据的填充与复制
- Redis基础(十二)——缓存读写策略
- Linux编程(6)_makefile
- Rainbond 5.0正式发布, 支持对接管理已有Kubernetes集群...