cocos項目集成到已有的Android工程


將cocos項目構(gòu)建為Android工程并構(gòu)建出對應(yīng)的aar

構(gòu)建Android工程

1.配置原生開發(fā)環(huán)境(ndk路徑隶债、Android sdk路徑)

2.打開構(gòu)建發(fā)布窗口進行如下配置


將cocos Android工程構(gòu)建為aar

1.將Cocos Creator導(dǎo)出的Android工程(../build/jsb-default/frameworks/runtime-src/proj.android-studio)用Android Studio打開并編譯秆剪,成功編譯并正常運行app工程后進入第2步滞磺。

2.將依賴庫工程libcocos2dx打成aar菩混,build完成后aar的位置為../build/jsb-default/frameworks/cocos2d-x/cocos/platform/android/libcocos2dx/build/outputs/aar/libcocos2dx-release.aar

3 修改game工程的build.gradle鸯两、AndroidManifest.xml文件
build.gradle這些代碼需要修改:

import org.apache.tools.ant.taskdefs.condition.Os
// 將game工程作為library宣吱,這個feature應(yīng)該是什么instantApp的配置
// apply plugin: 'com.android.feature'
apply plugin: 'com.android.library'
android {
    //注掉這里
    //baseFeature true
    compileSdkVersion PROP_COMPILE_SDK_VERSION.toInteger()
    buildToolsVersion PROP_BUILD_TOOLS_VERSION

    defaultConfig {
        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=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})
                }
            }
        }
    }

    sourceSets.main {
        java.srcDirs "../src", "src"
        res.srcDirs "../res", 'res'
        jniLibs.srcDirs "../libs", '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 {
            debuggable false
            jniDebuggable false
            renderscriptDebuggable false
            minifyEnabled true
            //作為library不能設(shè)置這個參數(shù)
            //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'
                }
            }
        }
    }

}

//將featureVariants改成libraryVariants
android.libraryVariants.all { variant ->
    // delete previous files first
    delete "${buildDir}/intermediates/merged_assets/"

    variant.mergeAssets.doLast {
        def sourceDir = "${buildDir}/../../../../.."

        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
        }
    }
}

/*android.featureVariants.all { variant ->
    // delete previous files first
    delete "${buildDir}/intermediates/merged_assets/"

    variant.mergeAssets.doLast {
        def sourceDir = "${buildDir}/../../../../.."

        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
        }
    }
}*/

dependencies {
    //注釋掉這些依賴,不然打成aar后會運行會報沖突
    /*implementation fileTree(dir: '../libs', include: ['*.jar','*.aar'])
    implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])
    implementation fileTree(dir: "../../../cocos2d-x/cocos/platform/android/java/libs", include: ['*.jar'])*/
    implementation 'com.google.android.instantapps:instantapps:1.1.0'
    implementation 'com.google.android.gms:play-services-instantapps:16.0.0'
    implementation project(':libcocos2dx')
}

找到game工程的AndroidManifest.xml注釋掉啟動頁標(biāo)簽(因為我們不希望我們的工程運行起來就直接進入游戲)

<activity
            android:name="org.cocos2dx.javascript.AppActivity"
            android:screenOrientation="sensorLandscape"
            android:configChanges="orientation|keyboardHidden|screenSize|screenLayout"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:taskAffinity=""
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >

            <intent-filter android:order="1">
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.BROWSABLE" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <!--<intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>-->
        </activity>

4.第3步完成后同步gradle然后將工程game打成aar明未,build完成后aar的位置為../build/jsb-default/frameworks/runtime-src/proj.android-studio/game/build/outputs/aar/game-release.aar


集成到Android工程

1.將拿到的libcocos2dx-release.aar和game-release.aar放入我們自己的工程libs文件夾下

并在工程的build.gradle依賴它們槽华、同步

2.創(chuàng)建我們自己的游戲Activity繼承自aar包里面的AppActivity

package com.example.myapplication;
import org.cocos2dx.javascript.AppActivity;

public class MyAppActivity extends AppActivity {

}

在manifest里注冊這個Activity

<activity
            android:name=".MyAppActivity"
            android:launchMode="singleInstance"
            android:taskAffinity=":MyAppActivity"
            android:process=":MyAppActivity"
            android:screenOrientation="sensorLandscape"
            android:configChanges="orientation|keyboardHidden|screenSize|screenLayout"
            android:label="@string/app_name"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >

            <!--<intent-filter android:order="1">
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.BROWSABLE" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>-->
</activity>

這里注意一下,由于cocos引擎有自己的資源釋放策略(它會在Activity結(jié)束后干掉所在進程)趟妥,所以為了不影響我們自己工程的進程必須將Activity放到另一個進程猫态。另外,我這里將這個Activity放入了新任務(wù)棧披摄,因為AppActivity亲雪、Cocos2dxActivity有些地方會去調(diào)用isTaskRoot,如果不把Activity放入新棧會導(dǎo)致代碼執(zhí)行不正確疚膊;當(dāng)然义辕,你也可以重寫isTaskRoot。

ok寓盗,到這里就算完成了集成了灌砖,直接使用startActivity就能跳轉(zhuǎn)到游戲頁面了。


最后cocos和Android相互通信的實現(xiàn)見官方文檔

https://docs.cocos.com/creator/manual/zh/advanced-topics/java-reflection.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末傀蚌,一起剝皮案震驚了整個濱河市基显,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌善炫,老刑警劉巖撩幽,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異销部,居然都是意外死亡摸航,警方通過查閱死者的電腦和手機制跟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門舅桩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人雨膨,你說我怎么就攤上這事擂涛。” “怎么了?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵撒妈,是天一觀的道長恢暖。 經(jīng)常有香客問我,道長狰右,這世上最難降的妖魔是什么杰捂? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮棋蚌,結(jié)果婚禮上嫁佳,老公的妹妹穿的比我還像新娘。我一直安慰自己谷暮,他們只是感情好蒿往,可當(dāng)我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著湿弦,像睡著了一般瓤漏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上颊埃,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天蔬充,我揣著相機與錄音,去河邊找鬼班利。 笑死娃惯,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的肥败。 我是一名探鬼主播趾浅,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼馒稍!你這毒婦竟也來了皿哨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤纽谒,失蹤者是張志新(化名)和其女友劉穎证膨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鼓黔,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡央勒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了澳化。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片崔步。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖缎谷,靈堂內(nèi)的尸體忽然破棺而出井濒,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布瑞你,位于F島的核電站酪惭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏者甲。R本人自食惡果不足惜春感,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望虏缸。 院中可真熱鬧甥厦,春花似錦、人聲如沸寇钉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扫倡。三九已至谦秧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撵溃,已是汗流浹背疚鲤。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缘挑,地道東北人集歇。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像语淘,于是被迫代替她去往敵國和親诲宇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內(nèi)容