Cocos2d-x游戏导出android工程,提取cocos的so文件

时间:2023-02-09 13:15:19
 
Cocos2d-x游戏导出android工程,提取cocos的so文件
 
原本cocos游戏的android工程编译时,需要将cocos的库文件进行编译,这些文件大部分是cpp文件,
使用ndk-build工具编译cpp文件非常慢,而且非常耗cpu,大概需要10-20分钟才能编译完成,这个还是因为我换了固态硬盘后的效果,没固态硬盘可能就gg
 
这个等待时间可能是一个不错的水群时间,或者上去看看新闻,有哪个好看的,好玩的。
但事与愿违啊!
电脑编译这个工程已经占据的80%cpu,这叫人怎么办啊,凉凉,只能慢慢等待,然而后面还有一大堆事情等着我们去处理,看来加班时间又得延长~ 。
 
众里寻它千百度,想的又想,都是一个cocos软件导出来的cocos库,怎么就不可以共用呢,觉得没道理啊。唯一不同的应该就是js文件吧
先来个正常导出工程截图
Cocos2d-x游戏导出android工程,提取cocos的so文件
Cocos2d-x游戏导出android工程,提取cocos的so文件
这是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游戏导出android工程,提取cocos的so文件

一个是cocos2d-x库文件,还有一个runtime-src这里放着各个平台的工程文件还有一个classes文件夹

Cocos2d-x游戏导出android工程,提取cocos的so文件

B. 游戏需要的Classes文件

有三个平台,android,mac,win

只看android工程文件proj.android-studio

可以使用android studio打开这个工程

  Cocos2d-x游戏导出android工程,提取cocos的so文件

打开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文件

Cocos2d-x游戏导出android工程,提取cocos的so文件

C,获得so文件

我们想要的so文件就出来了,只要编译出来的游戏可以正常运行,我们就可以提取这个so文件。

note:需要提取的是ndkBuild-》release->...->armeabi-v7a中的so文件,上面截图中的是调式的so

 

现在我们需要的资源都已经准备好的,可以进行工程的组合

,保险起见,我们新建一个文件夹进行android工程简化。

比如一个篮球游戏,新建basketball文件夹

Cocos2d-x游戏导出android工程,提取cocos的so文件

将as工程所有文件复制到basketball中,注意,红框中的文件不需要修改,

Cocos2d-x游戏导出android工程,提取cocos的so文件

一. 修改app下的文件,将上面标注的A js资源文件放到assets目录中

 Cocos2d-x游戏导出android工程,提取cocos的so文件

 

二. 将C中获得的so文件放到libs包对应cpu架构下面

Cocos2d-x游戏导出android工程,提取cocos的so文件

还有需要将cocos依赖的jar包也放到lib下面

D:\android-workspace\frameworks\cocos2d-x\cocos\platform\android\java\libs

Cocos2d-x游戏导出android工程,提取cocos的so文件

这四个jar包放到我们app的libs文件下

三。 添加额外的java 的cocos库文件

 需要将libs源码文件提取出来放到我们的app/src/main/java中

目录路径

D:\android-workspace\frameworks\cocos2d-x\cocos\platform\android\java\src\org\cocos2dx\lib

Cocos2d-x游戏导出android工程,提取cocos的so文件

复制到src.main.java

Cocos2d-x游戏导出android工程,提取cocos的so文件

 

 

 四. 修改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文件包名,修改写报错,程序就可以正常运行了。