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打开这个工程

 

打开build.gradle文件,

externalNativeBuild是用来配置生成so包的cpu架构

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
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目录中

二. 将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

四. 修改app/build.gradle文件

主要就是删除掉打包编译so文件的代码,去掉无用的依赖库

修改前

import org.apache.tools.ant.taskdefs.condition.Os

apply plugin: 'com.android.application'

android {
compileSdkVersion PROP_COMPILE_SDK_VERSION.toInteger()
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_MODE.compareTo('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 "AndroidManifest.xml"
} 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"
}
}
} 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-android.txt'), 'proguard-rules.pro'
if (project.hasProperty("RELEASE_STORE_FILE")) {
signingConfig signingConfigs.release
} externalNativeBuild {
ndkBuild {
arguments 'NDK_DEBUG=0'
}
}
} debug {
externalNativeBuild {
ndkBuild {
arguments 'NDK_DEBUG=1'
}
}
}
}
} android.applicationVariants.all { variant ->
// delete previous files first
delete "${buildDir}/intermediates/assets/${variant.dirName}" variant.mergeAssets.doLast {
copy {
from "${buildDir}/../../../../../res"
into "${buildDir}/intermediates/assets/${variant.dirName}/res"
} copy {
from "${buildDir}/../../../../../src"
into "${buildDir}/intermediates/assets/${variant.dirName}/src"
} copy {
from "${buildDir}/../../../../../jsb-adapter"
into "${buildDir}/intermediates/assets/${variant.dirName}/jsb-adapter"
} copy {
from "${buildDir}/../../../../../main.js"
from "${buildDir}/../../../../../project.json"
into "${buildDir}/intermediates/assets/${variant.dirName}"
}
}
} dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation fileTree(dir: "../../../cocos2d-x/cocos/platform/android/java/libs", include: ['*.jar'])
implementation project(':libcocos2dx')
}

修改后

import org.apache.tools.ant.taskdefs.condition.Os

apply plugin: 'com.android.application'

android {
compileSdkVersion PROP_COMPILE_SDK_VERSION.toInteger()
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"
} sourceSets.main {
java.srcDir "src"
res.srcDir "res"
jniLibs.srcDir "libs"
manifest.srcFile "AndroidManifest.xml"
} buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
externalNativeBuild {
ndkBuild {
arguments 'NDK_DEBUG=0'
}
}
} debug {
externalNativeBuild {
ndkBuild {
arguments 'NDK_DEBUG=1'
}
}
}
}
} dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
}

可能还需要修改下java文件包名,修改写报错,程序就可以正常运行了。

Cocos2d-x游戏导出android工程,提取cocos的so文件的更多相关文章

  1. GJM : Unity3D HIAR -【 快速入门 】 五、导出 Android 工程、应用

    导出 Android 工程.应用 在开始之前,请务必先保存您的工程,同时确认您已经安装 Android SDK 和 JDK.安装操作请参考以下链接: 搭建开发环境 Step 1. 设置 Android ...

  2. 【已解决】unity4.2.0f4 导出Android工程报错:Error building Player: ArgumentException: Illegal characters in path. [unity导出android工程 报错,路径含有非法字符]

    使用unity3D开发的一个客户端,需要导出为Android工程,然后接入一些第三方android SDK. unity版本 操作系统为: OS 名称: Microsoft Windows 7 旗舰版 ...

  3. android工程下assets与raw文件夹

    在应用的开发中,当我们创建一个新的Android工程后,我们会发现工程中包含了一个目录assets,另外当我们察看一些示例工程的时候,有时会发现在该工程的资源目录下会有一个raw目录(res/raw) ...

  4. android 工程里缺少 R.java 文件原因和解决方法

    作为新手,学习android 的时候难免要导入一些示例,目的为了更加了解android各种API用法,顺便也可以学习下别人代码的写法. 可是导入android源码后,基本都有错误,R.java也不会自 ...

  5. 导出android真机上应用的apk文件

    1. 首先你的手机要开启调试模式 2. 终端输入命令行 (这个时候需要在手机端打开此应用.它的思路是抓取出当前窗口的包名.以下命令操作自己未亲自验证.) adb shell dumpsys windo ...

  6. 【Unity与Android】02-在Unity导出的Android工程中接入Google Admob广告

    我在上一篇文章 [Unity与Android]01-Unity与Android交互通信的简易实现) 中介绍了Unity与Android通讯的基本方法. 这一篇开始进入应用阶段,这次要介绍的是如何在An ...

  7. Android工程图片资源命名禁忌

    Android工程中,res\drawable\ 文件夹下所有的图片资源文件命名,不允许: 1. 大写字母 从Eclipse的这个报错可以知道资源文件的命名规则. Invalid file name: ...

  8. 【Android学习】Android工程资源命名禁忌

    在制作一个继续按钮时,将button的id设置为continue,发现报了错误,error: invalid symbol: 'continue' 一开始还以为是编码问题,后来百度之后才知道安卓And ...

  9. 如何在使用eclipse的情况下,清理android项目中的冗余class文件和资源文件以及冗余图片

    在我们迭代项目的过程中,经常会启用某些功能,或者修改某些界面的问题,那么问题来了,这样很容易出现大量的冗余.java文件,冗余资源文件,一些冗余的界面文件等.那么问题既然出现了,那么如何去解决呢,这就 ...

随机推荐

  1. git-fork其他人的代码

    1. 2. 3.然后在本地创建目录      第一步:mkdir test      第二步:cd test      第三步:git init(初始化)      第五步:git remote ad ...

  2. C++中的乱七八糟问题

    1   在编写的c++程序中,如果是窗口,有时会一闪就消失了,如果不想让其消失,在程序结尾处添加: #include“iostream.h” system("pause"); 分析 ...

  3. C++总的const使用说明

    C++总的const使用说明 1. const修饰类成员变量 程序: #include <iostream> using namespace std; class A { public: ...

  4. poj1836 Alignment

    Alignment Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 11707   Accepted: 3730 Descri ...

  5. Java核心编程快速学习(转载)

    http://www.cnblogs.com/wanliwang01/p/java_core.html Java核心编程部分的基础学习内容就不一一介绍了,本文的重点是JAVA中相对复杂的一些概念,主体 ...

  6. ASP.NET Core 2 学习笔记(八)URL重写

    路由跟URL 重写的功能性略有不同.路由是将Request 找到对应的服务,而URL 重写是为了推卸责任转送Request.本篇将简单介绍下ASP.NET Core的URL重写(URL Rewrite ...

  7. NetCore偶尔有用篇:NetCore项目添加MIME

    一.简介 1.系统默认给我们提供的一些文件类型的处理方式. 2.系统没有为我们提供处理的文件类型无法使用,例如:apk 3.这里候就需要自己添加MIME,才能进行访问 4.下面就是添加apk访问的示例 ...

  8. 枚举类型内部函数 enumerate

    enumerate()说明enumerate()是python的内置函数enumerate在字典上是枚举.列举的意思对于一个可迭代的(iterable)/可遍历的对象(如列表.字符串),enumera ...

  9. IOS - IPhone或IPAD,如何恢复出厂操作系统?

    IPhone或IPAD的操作系统都是IOS,如果IPhone或IPAD越狱,或其它原因导致不能正常使用了,恢复出厂设置能够得到一个可以正常工作的设备.恢复的方法也比较简单,就是用iTunes,一般情况 ...

  10. socket agent统一模板

    # -*- coding: utf- -*- # data:-- : # user:DIY # file:agent_eay.py import socket def work(i): sock = ...