当前位置:   article > 正文

CocosCreator游戏导出android工程,提取cocos的so文件_creator3.7.4 导出安卓工程

creator3.7.4 导出安卓工程

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架构

复制代码

 
  1. externalNativeBuild {

  2. ndkBuild {

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

  4. // skip the NDK Build step if PROP_NDK_MODE is none

  5. targets 'cocos2djs'

  6. arguments 'NDK_TOOLCHAIN_VERSION=4.9'

  7. def module_paths = [project.file("../../../cocos2d-x"),

  8. project.file("../../../cocos2d-x/cocos"),

  9. project.file("../../../cocos2d-x/external")]

  10. if (Os.isFamily(Os.FAMILY_WINDOWS)) {

  11. arguments 'NDK_MODULE_PATH=' + module_paths.join(";")

  12. }

  13. else {

  14. arguments 'NDK_MODULE_PATH=' + module_paths.join(':')

  15. }

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

  17. abiFilters.addAll(PROP_APP_ABI.split(':').collect{it as String})

  18. }

  19. }

  20. }

  21. }

复制代码

 
  1. // Specifies which native libraries to build and package for this

  2. // product flavor. If you don't configure this property, Gradle

  3. // builds and packages all shared object libraries that you define

  4. // in your CMake or ndk-build project.

  5. 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文件中获取到了

 
  1. PROP_TARGET_SDK_VERSION=19

  2. 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文件的代码,去掉无用的依赖库

修改前

复制代码

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

  2. apply plugin: 'com.android.application'

  3. android {

  4. compileSdkVersion PROP_COMPILE_SDK_VERSION.toInteger()

  5. buildToolsVersion PROP_BUILD_TOOLS_VERSION

  6. defaultConfig {

  7. applicationId "com.uelink.JewelBlockPuzzle"

  8. minSdkVersion PROP_MIN_SDK_VERSION

  9. targetSdkVersion PROP_TARGET_SDK_VERSION

  10. versionCode 1

  11. versionName "1.0"

  12. externalNativeBuild {

  13. ndkBuild {

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

  15. // skip the NDK Build step if PROP_NDK_MODE is none

  16. targets 'cocos2djs'

  17. arguments 'NDK_TOOLCHAIN_VERSION=4.9'

  18. def module_paths = [project.file("../../../cocos2d-x"),

  19. project.file("../../../cocos2d-x/cocos"),

  20. project.file("../../../cocos2d-x/external")]

  21. if (Os.isFamily(Os.FAMILY_WINDOWS)) {

  22. arguments 'NDK_MODULE_PATH=' + module_paths.join(";")

  23. }

  24. else {

  25. arguments 'NDK_MODULE_PATH=' + module_paths.join(':')

  26. }

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

  28. abiFilters.addAll(PROP_APP_ABI.split(':').collect{it as String})

  29. }

  30. }

  31. }

  32. }

  33. sourceSets.main {

  34. java.srcDir "src"

  35. res.srcDir "res"

  36. jniLibs.srcDir "libs"

  37. manifest.srcFile "AndroidManifest.xml"

  38. }

  39. externalNativeBuild {

  40. ndkBuild {

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

  42. // skip the NDK Build step if PROP_NDK_MODE is none

  43. path "jni/Android.mk"

  44. }

  45. }

  46. }

  47. signingConfigs {

  48. release {

  49. if (project.hasProperty("RELEASE_STORE_FILE")) {

  50. storeFile file(RELEASE_STORE_FILE)

  51. storePassword RELEASE_STORE_PASSWORD

  52. keyAlias RELEASE_KEY_ALIAS

  53. keyPassword RELEASE_KEY_PASSWORD

  54. }

  55. }

  56. }

  57. buildTypes {

  58. release {

  59. minifyEnabled false

  60. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

  61. if (project.hasProperty("RELEASE_STORE_FILE")) {

  62. signingConfig signingConfigs.release

  63. }

  64. externalNativeBuild {

  65. ndkBuild {

  66. arguments 'NDK_DEBUG=0'

  67. }

  68. }

  69. }

  70. debug {

  71. externalNativeBuild {

  72. ndkBuild {

  73. arguments 'NDK_DEBUG=1'

  74. }

  75. }

  76. }

  77. }

  78. }

  79. android.applicationVariants.all { variant ->

  80. // delete previous files first

  81. delete "${buildDir}/intermediates/assets/${variant.dirName}"

  82. variant.mergeAssets.doLast {

  83. copy {

  84. from "${buildDir}/../../../../../res"

  85. into "${buildDir}/intermediates/assets/${variant.dirName}/res"

  86. }

  87. copy {

  88. from "${buildDir}/../../../../../src"

  89. into "${buildDir}/intermediates/assets/${variant.dirName}/src"

  90. }

  91. copy {

  92. from "${buildDir}/../../../../../jsb-adapter"

  93. into "${buildDir}/intermediates/assets/${variant.dirName}/jsb-adapter"

  94. }

  95. copy {

  96. from "${buildDir}/../../../../../main.js"

  97. from "${buildDir}/../../../../../project.json"

  98. into "${buildDir}/intermediates/assets/${variant.dirName}"

  99. }

  100. }

  101. }

  102. dependencies {

  103. implementation fileTree(dir: 'libs', include: ['*.jar'])

  104. implementation fileTree(dir: "../../../cocos2d-x/cocos/platform/android/java/libs", include: ['*.jar'])

  105. implementation project(':libcocos2dx')

  106. }

复制代码

 修改后

复制代码

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

  2. apply plugin: 'com.android.application'

  3. android {

  4. compileSdkVersion PROP_COMPILE_SDK_VERSION.toInteger()

  5. buildToolsVersion PROP_BUILD_TOOLS_VERSION

  6. defaultConfig {

  7. applicationId "com.uelink.JewelBlockPuzzle"

  8. minSdkVersion PROP_MIN_SDK_VERSION

  9. targetSdkVersion PROP_TARGET_SDK_VERSION

  10. versionCode 1

  11. versionName "1.0"

  12. }

  13. sourceSets.main {

  14. java.srcDir "src"

  15. res.srcDir "res"

  16. jniLibs.srcDir "libs"

  17. manifest.srcFile "AndroidManifest.xml"

  18. }

  19. buildTypes {

  20. release {

  21. minifyEnabled false

  22. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

  23. externalNativeBuild {

  24. ndkBuild {

  25. arguments 'NDK_DEBUG=0'

  26. }

  27. }

  28. }

  29. debug {

  30. externalNativeBuild {

  31. ndkBuild {

  32. arguments 'NDK_DEBUG=1'

  33. }

  34. }

  35. }

  36. }

  37. }

  38. dependencies {

  39. implementation fileTree(dir: 'libs', include: ['*.jar'])

  40. }

复制代码

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

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/132934
推荐阅读
相关标签
  

闽ICP备14008679号