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的编译
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代码
如果需要查看Android.mk语法可以查看下这个https://www.cnblogs.com/gne-hwz/p/9996641.html
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模式
--------------- 越长大越无知
android学习-ndk-build(androidstudio编译cocos2d-x库的cpp为so文件的解释)的更多相关文章
- 〖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等类型的文件的解释
原文地址: ArcGIS问题:dbf shp shx sbn sbx mdb adf等类型的文件的解释 - Silent Dawn的日志 - 网易博客 http://gisman.blog.163.c ...
- Eclipse下Android的NDK开发环境配置
编辑2016年7月26日——增加了下载网址,修改了一些错误. 摸索了一周,走了很多弯路,磕磕绊绊,总算是弄好了NDK的开发环境,在这里总结一下吧. 一.Android NDK开发环境 首先下载安装JR ...
- Android学习——移植tr069程序到Android平台
原创作品,转载请注明出处,严禁非法转载.如有错误,请留言! email:40879506@qq.com 声明:本系列涉及的开源程序代码学习和研究,严禁用于商业目的. 如有任何问题,欢迎和我交流.(企鹅 ...
- 将 Android* x86 NDK 供 Eclipse* 而移植 NDK 演示示例应用程序
目标 面向 Eclipse (ADT) 的 Android 插件如今支持基于 NDK 的应用开发. 其可自己主动生成项目和构件文件以及代码存根.并可集成到整个 Android 应用开发中(构建原生库. ...
随机推荐
- Delphi for iOS开发指南(1):在Mac上配置你的开发环境
http://cache.baiducontent.com/c?m=9d78d513d99516f11ab7cf690d678c3b584380122ba7a0020fd18438e4732b4050 ...
- ASP.NET MVC+Redis (准备工作)
今天准备更新这个项目的第二篇博客.有一点需要说明的是之前觉得用的是Asp.net的WebPage,经过查看微软的官方文档还有相关的博客,相比较而言使用起来需要安装一个自动工具WebMatrix可以很快 ...
- ASP.Net Core 2.2 MVC入门到基本使用系列 (四)
本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力. 本教程知识点大体 ...
- [Xamarin]我的Xamarin填坑之旅(一)
一想到明天是星期五,不对,是今天,心里就很激动,毕竟明天没课.激动之余,来写一篇博客,记录一下最近踏坑Xamarin开发校园助手APP的一些事儿.也许更像是一篇流水账. 在扯Xamarin之前,有必要 ...
- 前端分享----JS异步编程+ES6箭头函数
前端分享----JS异步编程+ES6箭头函数 ##概述Javascript语言的执行环境是"单线程"(single thread).所谓"单线程",就是指一次只 ...
- 【自动化专题】selenium如何轻松搞定文件上传
使用selenium做自动化时,我们经常会遇到的一个让人头疼的问题就是文件上传. 问题的难点在于selenium无法识别并操作Windows窗口,若我们可以绕过弹出框直接把文件信息上传给选择按钮,难点 ...
- map函数和reduce函数、filter函数的区别
①从参数方面来讲:map()函数: map()包含两个参数,第一个是参数是一个函数,第二个是序列(列表或元组).其中,函数(即map的第一个参数位置的函数)可以接收一个或多个参数.reduce()函数 ...
- Text and Binary modes
http://perlmaven.com/what-is-a-text-file https://cygwin.com/cygwin-ug-net/using-textbinary.html Text ...
- 听补天漏洞审核专家实战讲解XXE漏洞
对于将“挖洞”作为施展自身才干.展现自身价值方式的白 帽 子来说,听漏洞审核专家讲如何挖掘并验证漏洞,绝对不失为一种快速的成长方式! XXE Injection(XML External Entity ...
- MVC各部分技术体现
视图层用jsp,javascript 作用--显示数据,接受用户输入数据 控制层用servlet 作用--接收视图层数据,传输 给业务逻辑层(即模型层) 模型层用普通java class 作用-- ...