Cocos2d-x游戏导出android⼯程,提取cocos的so⽂件
Cocos2d-x游戏导出android⼯程,提取cocos的so⽂件
原本cocos游戏的android⼯程编译时,需要将cocos的库⽂件进⾏编译,这些⽂件⼤部分是cpp⽂件,
使⽤ndk-build⼯具编译cpp⽂件⾮常慢,⽽且⾮常耗cpu,⼤概需要10-20分钟才能编译完成,这个还是因为我换了固态硬盘后的效果,没固态硬盘可能就gg
这个等待时间可能是⼀个不错的⽔时间,或者上去看看新闻,有哪个好看的,好玩的。
但事与愿违啊!
电脑编译这个⼯程已经占据的80%cpu,这叫⼈怎么办啊,凉凉,只能慢慢等待,然⽽后⾯还有⼀⼤堆事情等着我们去处理,看来加班时间⼜得延长~ 。
众⾥寻它千百度,想的⼜想,都是⼀个cocos软件导出来的cocos库,怎么就不可以共⽤呢,觉得没道理啊。唯⼀不同的应该就是js⽂件吧先来个正常导出⼯程截图
这是jsb-default⽂件夹内的⽂件。js backups(useful for debugging)这个是js源码⽂件,没什么⽤处
A .游戏资源
jsb-adapter,
res
src
main.js
project.json
这五个⽂件是不同游戏的不同js⽂件,有游戏的js脚本,res有游戏图⽚资源,main.js应该是游戏的主⼊⼝,负责加载资源及脚本
看完游戏资源,再看下frameworksw⽂件夹
⼀个是cocos2d-x库⽂件,还有⼀个runtime-src这⾥放着各个平台的⼯程⽂件还有⼀个classes⽂件夹
B. 游戏需要的Classes⽂件
有三个平台,android,mac,win
只看android⼯程⽂件proj.android-studio
可以使⽤android studio打开这个⼯程
打开adle⽂件,
externalNativeBuild是⽤来配置⽣成so包的cpu架构
externalNativeBuild {
ndkBuild {
if (!project.hasProperty("PROP_NDK_MODE") || PROP_NDK_MODEpareTo('none') != 0) {
// skip the NDK Build step if PROP_NDK_MODE is none
targets 'cocos2djs'
arguments 'NDK_TOOLCHAIN_VERSION=4.9'
def module_paths = [project.file("../../../cocos2d-x"),
project.file("../../../cocos2d-x/cocos"),
project.file("../../../cocos2d-x/external")]
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
arguments 'NDK_MODULE_PATH=' + module_paths.join(";")
}
else {
arguments 'NDK_MODULE_PATH=' + module_paths.join(':')
}
arguments '-j' + Runtime.runtime.availableProcessors()
abiFilters.addAll(PROP_APP_ABI.split(':').collect{it as String})
}
}
}
}
// Specifies which native libraries to build and package for this
/
/ product flavor. If you don't configure this property, Gradle
// builds and packages all shared object libraries that you define
// in your CMake or ndk-build project.
targets 'cocos2djs'
这个targets参数,指定哪个native库⽤来构建和打包,如果没有配置这个属性,gradle会将所有native库进⾏构建和打包,猜测应该是调⽤cocos2djs这个底层库进⾏编译
arguments是gradle配置ndk参数的⽅法,⽤来设置ndk-build打包时的参数
最重要的是abiFilters这个过滤,规定需要打包的CPU架构,
abiFilters.addAll(PROP_APP_ABI.split(':').collect{it as String})
PROP_APP_ABI属性是从Android⼯程的gradle.properties⽂件中获取到了
PROP_TARGET_SDK_VERSION=19
PROP_APP_ABI=armeabi-v7a:x86:arm64-v8a
表⽰以:分割,
这样编译后会出来三个架构的so⽂件
C,获得so⽂件
我们想要的so⽂件就出来了,只要编译出来的游戏可以正常运⾏,我们就可以提取这个so⽂件。note:需要提取的是ndkBuild-》release->...->armeabi-v7a中的so⽂件,上⾯截图中的是调式的so
现在我们需要的资源都已经准备好的,可以进⾏⼯程的组合
,保险起见,我们新建⼀个⽂件夹进⾏android⼯程简化。
⽐如⼀个篮球游戏,新建basketball⽂件夹
将as⼯程所有⽂件复制到basketball中,注意,红框中的⽂件不需要修改,
⼀. 修改app下的⽂件,将上⾯标注的A js资源⽂件放到assets⽬录中
游戏xml文件修改
⼆. 将C中获得的so⽂件放到libs包对应cpu架构下⾯
还有需要将cocos依赖的jar包也放到lib下⾯
D:\android-workspace\frameworks\cocos2d-x\cocos\platform\android\java\libs
这四个jar包放到我们app的libs⽂件下
三。添加额外的java 的cocos库⽂件
需要将libs源码⽂件提取出来放到我们的app/src/main/java中
⽬录路径
D:\android-workspace\frameworks\cocos2d-x\cocos\platform\android\java\src\org\cocos2dx\lib
复制到src.main.java
四. 修改adle⽂件
主要就是删除掉打包编译so⽂件的代码,去掉⽆⽤的依赖库
修改前
import ls.dition.Os
apply plugin: 'com.android.application'
android {
compileSdkVersion PROP_COMPILE_Integer()
buildToolsVersion PROP_BUILD_TOOLS_VERSION
defaultConfig {
applicationId "com.uelink.JewelBlockPuzzle"
minSdkVersion PROP_MIN_SDK_VERSION
targetSdkVersion PROP_TARGET_SDK_VERSION
versionCode 1
versionName "1.0"
externalNativeBuild {
ndkBuild {
if (!project.hasProperty("PROP_NDK_MODE") || PROP_NDK_MODEpareTo('none') != 0) {
// skip the NDK Build step if PROP_NDK_MODE is none
targets 'cocos2djs'
arguments 'NDK_TOOLCHAIN_VERSION=4.9'
def module_paths = [project.file("../../../cocos2d-x"),
project.file("../../../cocos2d-x/cocos"),
project.file("../../../cocos2d-x/external")]
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
arguments 'NDK_MODULE_PATH=' + module_paths.join(";")
}
else {
arguments 'NDK_MODULE_PATH=' + module_paths.join(':')
}
arguments '-j' + Runtime.runtime.availableProcessors()
abiFilters.addAll(PROP_APP_ABI.split(':').collect{it as String})
}
}
}
}
sourceSets.main {
java.srcDir "src"
res.srcDir "res"
jniLibs.srcDir "libs"
manifest.srcFile "l"
}
externalNativeBuild {
ndkBuild {
if (!project.hasProperty("PROP_NDK_MODE") || PROP_NDK_MODEpareTo('none') != 0) {
// skip the NDK Build step if PROP_NDK_MODE is none
path "jni/Android.mk"
}
}
}
signingConfigs {
release {
if (project.hasProperty("RELEASE_STORE_FILE")) {
storeFile file(RELEASE_STORE_FILE)
storePassword RELEASE_STORE_PASSWORD
keyAlias RELEASE_KEY_ALIAS
keyPassword RELEASE_KEY_PASSWORD
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile(''), 'proguard-rules.pro'
if (project.hasProperty("RELEASE_STORE_FILE")) {
lease
}
externalNativeBuild {
ndkBuild {
arguments 'NDK_DEBUG=0'
}