文章目錄
- 一,前言
- 二,教程
- 1. CocosCreator構建發布
- 2. 匯入libcocos2dx
- 3.修改gradle配置
- 3.復制jni檔案夾
- 4. 復制Activity
- 5.編譯運行
- 6.出現的bug
一,前言
CocosCreator可以將開發的游戲發布到Android平臺,使用Android Studio可以構建和運行編譯目錄下(frameworks\runtime-src\proj.android-studio)的工程,但其生成的工程比較復雜,當我們需要從一個已有的Android專案啟動我們開發出的游戲時,整合的程序極其繁瑣,筆者整理了整合程序,供有需要的同志參考,
二,教程
1. CocosCreator構建發布
發布平臺選擇Android,模板選擇default,方便后續整合,APP ABI筆者選擇的是arm64-v8a,依次點擊下方的“構建”、“編譯“,編譯程序會比較慢,

編譯成功后會在發布路徑生成jsb-default檔案夾,

2. 匯入libcocos2dx
將編譯路徑下的:frameworks\cocos2d-x 整個檔案夾整個拷貝到我們自己的安卓專案根目錄,然后在自己的安卓專案根目錄下的setting.gradle中添加如下代碼:
include ':libcocos2dx'
project(':libcocos2dx').projectDir = new File('cocos2d-x\\cocos\\platform\\android\\libcocos2dx')
3.修改gradle配置
將proj.android-studio\gradle.properties里的內容復制到我們自己的安卓專案對應的gradle.properties里:
# Android SDK version that will be used as the compile project
PROP_COMPILE_SDK_VERSION=29
# Android SDK version that will be used as the earliest version of android this application can run on
PROP_MIN_SDK_VERSION=16
# Android SDK version that will be used as the latest version of android this application has been tested on
PROP_TARGET_SDK_VERSION=29
# Android Build Tools version that will be used as the compile project
PROP_BUILD_TOOLS_VERSION=28.0.3
# List of CPU Archtexture to build that application with
# Available architextures (armeabi-v7a | arm64-v8a | x86)
# To build for multiple architexture, use the `:` between them
# Example - PROP_APP_ABI=arm64-v8a
PROP_APP_ABI=arm64-v8a
#這部分的內容注釋掉不用,有需要的可以自行探索
# fill in sign information for release mode
#RELEASE_STORE_FILE=D:/software/cocosDashboard/resources/.editors/Creator/2.4.2/resources/static/build-templates/native/debug.keystore
#RELEASE_STORE_PASSWORD=123456
#RELEASE_KEY_ALIAS=debug_keystore
#RELEASE_KEY_PASSWORD=123456
android.injected.testOnly=false
然后sync
將proj.android-studio\app\build.gradle里的內容復制到我們安卓目錄下的app\build.gradle
-
externalNativeBuild

externalNativeBuild這里要修改路徑
-
下面的externalNativeBuild和buildTypes照常復制過去

-
android.applicationVariants.all 需要修改一下,并且修改sourceDir的路徑:
android.applicationVariants.all { variant ->
// delete previous files first
delete "${buildDir}/intermediates/merged_assets/${variant.dirName}"
variant.mergeAssets.doLast {
def sourceDir = "D:/build/jsb-default"//這里改成你的編譯路徑
// 以下幾行是舊的代碼,在新版Gradle下有問題
// copy {
// from "${sourceDir}/res"
// into "${outputDir}/res"
// }
//
// copy {
// from "${sourceDir}/src"
// into "${outputDir}/src"
// }
//
// copy {
// from "${sourceDir}/jsb-adapter"
// into "${outputDir}/jsb-adapter"
// }
// 新的拷貝檔案的方法,在新版Gradle可用
copy{
from "${sourceDir}"
include "assets/**"
include "res/**"
include "src/**"
include "jsb-adapter/**"
into outputDir
}
copy {
from "${sourceDir}/main.js"
from "${sourceDir}/project.json"
into outputDir
}
}
}
android.applicationVariants.all是將我們的游戲資源,包括代碼和圖片資源都復制到編譯輸出目錄,如果你的游戲啟動后資源沒加載出來,可能就是這里的路徑沒有配置好,
- 在dependencies里加入下面兩行匯入libcocos2dx(在這里是為專案匯入libcocos2dx,名字可以在第二步修改):

此處貼一下我復制好后的app\build.gradle
import org.apache.tools.ant.taskdefs.condition.Os
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 29
buildToolsVersion "28.0.3"
defaultConfig {
applicationId "com.example.testmw"
minSdkVersion 23
targetSdkVersion 29
versionCode 1
versionName "1.0"
multiDexEnabled true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
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=clang'
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})
}
}
}
}
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"
}
}
}
buildTypes {
release {
debuggable false
jniDebuggable false
renderscriptDebuggable false
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
if (project.hasProperty("RELEASE_STORE_FILE")) {
signingConfig signingConfigs.release
}
externalNativeBuild {
ndkBuild {
arguments 'NDK_DEBUG=0'
}
}
}
debug {
debuggable true
jniDebuggable true
renderscriptDebuggable true
externalNativeBuild {
ndkBuild {
arguments 'NDK_DEBUG=1'
}
}
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
sourceSets {
main { jniLibs.srcDirs = ['libs'] }
}
packagingOptions {
exclude 'META-INF/proguard/coroutines.pro'
exclude 'META-INF/proguard/okhttp3.pro'
}
}
android.applicationVariants.all { variant ->
// delete previous files first
delete "${buildDir}/intermediates/merged_assets/${variant.dirName}"
variant.mergeAssets.doLast {
def sourceDir = "D:/build/jsb-default"
//
// copy {
// from "${sourceDir}/assets"
// into "${outputDir}/assets"
// }
//
// copy {
// from "${sourceDir}/src"
// into "${outputDir}/src"
// }
//
// copy {
// from "${sourceDir}/jsb-adapter"
// into "${outputDir}/jsb-adapter"
// }
//
// copy {
// from "${sourceDir}/main.js"
// from "${sourceDir}/project.json"
// into outputDir
// }
// 新的拷貝檔案的方法,在新版Gradle可用
copy{
from "${sourceDir}"
include "assets/**"
include "res/**"
include "src/**"
include "jsb-adapter/**"
into outputDir
}
copy {
from "${sourceDir}/main.js"
from "${sourceDir}/project.json"
into outputDir
}
}
}
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
......
......
implementation fileTree(dir: "../cocos2d-x/cocos/platform/android/java/libs", include: ['*.jar'])
implementation project(':libcocos2dx')
}
3.復制jni檔案夾
復制proj.android-studio/app/jni檔案夾到自己安卓目錄的app檔案夾里


再復制proj.android-studio\jni整個檔案夾到自己的專案根目錄里

從jsb-default\frameworks\runtime-src里把Classes檔案夾拷貝到專案根目錄的jni檔案夾里,因為jni檔案夾里的CocosAndroid.mk定義了Classes的路徑(LOCAL_C_INCLUDES和LOCAL_SRC_FILES),我們需要在這個檔案里重新修改為我們剛剛Classes所在的相對路徑,(或者不復制Classes檔案夾里的內容,使用絕對路徑):
修改前:

修改后:

這一步后,我們自己的專案根目錄里多了個jni檔案夾:

app目錄下多了個jni檔案夾

4. 復制Activity
修改版本

復制路徑proj.android-studio\src\org\cocos2dx\javascript下的檔案到專案里,修改相關的import資訊

將proj.android-studio\app\AndroidManifest.xml里對Activity的注冊和meta-data復制到我們自己的AndroidManifest.xml里
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.testapp1002">
<uses-feature android:glEsVersion="0x00020000" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<meta-data android:name="android.app.lib_name"
android:value="cocos2djs" />
<activity
android:name=".AppActivity"
android:screenOrientation="sensorLandscape"
android:configChanges="orientation|keyboardHidden|screenSize|screenLayout"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:launchMode="singleTask"
android:taskAffinity="" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MainActivity">
</activity>
</application>
</manifest>
5.編譯運行
上面的4步完成后可以開始在Android Studio里編譯運行,
然后會發現main.cpp報錯,這是因為AppDelegate.h檔案的include路徑錯誤,需要在/jni/hellojavascript/main.cpp原始碼里修改一下

第一次編譯會比較久

6.出現的bug
當完成以上5個步驟后,我們可以在自己的專案里像使用Activity一樣啟動我們的游戲了,
Intent(that, AppActivity::class.java).apply { startActivity(this) }
但是可能會在打開這個Activity的時候閃退,我自己查看的日志顯示的原因是Cocos2dxHelper.registerBatteryLevelReceiver(this);這一行代碼出錯了,找不到靜態方法,我選擇將這個和BatteryLevelReceiver相關的代碼注釋掉,
即修改路徑cocos2d-x\cocos\platform\android\java\src\org\cocos2dx\lib下Cocos2dxActivity.java
注釋以下兩行代碼:
Cocos2dxHelper.registerBatteryLevelReceiver(this);
Cocos2dxHelper.unregisterBatteryLevelReceiver(this);;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/154092.html
標籤:其他
下一篇:CF377A Maze題解
