Android项目中嵌入Cocos游戏项目
Posted bdmh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android项目中嵌入Cocos游戏项目相关的知识,希望对你有一定的参考价值。
Cocos的生态相比Unity要逊色很多,网上搜索的各种文章,基本都是比较早期的,无法在较新版本环境中使用,这里以Cocos 3.3版本为例,讲一下在自己的android项目中嵌入Cocos项目。
一、创建Cocos项目(略)。
二、编译Cocos Android工程。
需要下载NDK。在偏好设置中,设置路径。
Cocos菜单中选择“项目——构建发布”,弹出如下界面。
我已经创建了一个名字为android的构建任务,大家可以新建一个。
“build”是 工程构建的目录,“android-001”是构建后,该项目存在的目录。
构建的工程都会放到Cocos项目目录下,比如你的目录为“D:\\Source\\cocos”,那构建后的目录就在“D:\\Source\\cocos\\build”下。
在你构建的项目的目录下,比如“D:\\Source\\cocos\\build\\android-001”下,有两个目录。
“assets”是资源目录,proj是工程目录,我们要用Android Studio来编译proj下面的项目。在proj下的gradle.properties文件中,定义了一些公共变量,包括目录和版本等信息。
PROP_TARGET_SDK_VERSION=26
# Android Build Tools version that will be used as the compile project
PROP_BUILD_TOOLS_VERSION=30.0.2
# Android Application Name
PROP_APP_NAME=game_test
# Instant App
PROP_ENABLE_INSTANT_APP=false
PROP_NDK_PATH=D:\\\\Source\\\\android-ndk-r23b
# Cocos Engine Path
COCOS_ENGINE_PATH=D:/Program Files/CocosDashboard/resources/.editors/Creator/3.3.0/resources/resources/3d/engine-native
# Res path
RES_PATH=D:/Source/cocos/build/android-001
# Native source dir
NATIVE_DIR=D:/Source/cocos/native/engine/android
# Application ID
APPLICATION_ID=com.cocos.android
# List of CPU Archtexture to build that application with
# Available architextures (armeabi-v7a | arm64-v8a | x86 | x86_64)
# To build for multiple architexture, use the `:` between them
# Example - PROP_APP_ABI=arm64-v8a
PROP_APP_ABI=arm64-v8a
PROP_APP就设置为arm64-v8a即可,一般手机都没问题,如果加上x86,编译过不去,原因未解。
COCOS_ENGINE_PATH是指向Cocos安装目录的, 其中的“D:\\Program Files\\CocosDashboard\\resources\\.editors\\Creator\\3.3.0\\resources\\resources\\3d\\engine-native\\cocos\\platform\\android\\libcocos2dx”目录将被proj中的工程引用。
我们再看一下proj的setting.gradle文件。我给项目起的名称为cocos,大家随意即可。“:libservice”在proj自己的目录中。
include ':libcocos',':libservice',':cocos'
//这个就是指向了Cocos安装目录中的libcocos2dx
//如:D:\\Program Files\\CocosDashboard\\resources\\.editors\\Creator\\3.3.0\\resources\\resources\\3d\\engine-native\\cocos\\platform\\android\\libcocos2dx
project(':libcocos').projectDir = new File(COCOS_ENGINE_PATH,'cocos/platform/android/libcocos2dx')
//这里就是引用的D:/Source/cocos/native/engine/android这个module
project(':cocos').projectDir = new File(NATIVE_DIR, 'app')
if(PROP_ENABLE_INSTANT_APP == "true" || PROP_ENABLE_INSTANT_APP == "yes")
include ':instantapp'
project(':instantapp').projectDir = new File(NATIVE_DIR, 'instantapp')
rootProject.name = "cocos"
用Android Studio打开proj项目。Cocos 3.3使用的是Gradle 4.1.0,可使用默认的设置进行编译。如果使用高版本Gradle的话,可能会报错,一些js文件没有打包进去,这个网上有修改方法,可自行查阅。
编译成功后,在Cocos项目目录下会多出一个native目录,“D:\\Source\\cocos\\native”,Cocos从3.0开始,做了代码和配置的分离,将一部分代码和配置放入源码管理,位于项目目录下的 native\\engine\\当前构建的平台名称
文件夹中(例如native\\engine\\android
)。
在“D:\\Source\\cocos\\native\\engine”下有两个目录,“android”目录是android代码,“common”目录是CMake相关的文件,用于编译C++用。
Cocos官方建议在这里进行二次开发,添加自己的业务和组件,这里的代码其实是作为Module被“build\\android-001\\proj”引入的,如果你已经有一个android工程,那么在这里开发绝对不是好的方法。
三、嵌入
先保证上面操作正常,“build\\android-001\\proj”编译通过。接下来新建一个Android工程。
首选在gradle.properties中定义对应的路径等变量。可复制Cocos工程下的proj中的gradle.properties内容。
接下来设置setting.gradle文件内容。
dependencyResolutionManagement
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories
google()
mavenCentral()
jcenter() // Warning: this repository is going to shut down soon
rootProject.name = "My Application"
include ':app'
include ':libcocos'
project(':libcocos').projectDir = new File(COCOS_ENGINE_PATH,'cocos/platform/android/libcocos2dx')
include ':libservice'
“:libcocos”的设置同上,“:libservice”可以import到当前项目的目录下。从“D:\\Source\\cocos\\build\\android-001\\proj\\libservice”下引入,也可以像“:libcocos”一样设置projectDir。
将Cocos项目编译后产生的“D:\\Source\\cocos\\native\\engine”目录下的“common”目录拷贝到Android项目下。
将“D:\\Source\\cocos\\native\\engine\\android\\jni”拷贝到Android项目下。
将“D:\\Source\\cocos\\native\\engine\\android\\CMakeLists.txt”拷贝到Android项目下。
因为相对于“D:\\Source\\cocos\\native\\engine”中,common目录的相对路径放生了变化,所以需要修改一下“CMakeLists.txt”内容。
将所有
$CMAKE_CURRENT_LIST_DIR/../common
改为
$CMAKE_CURRENT_LIST_DIR/common
将Cocos安装目录下的“D:\\Program Files\\CocosDashboard\\resources\\.editors\\Creator\\3.3.0\\resources\\resources\\3d\\engine-native\\cocos\\platform\\android\\java\\libs”目录中的文件拷贝到Android项目中的libs目录下,然后在build.gradle文件中加入如下文字。
implementation files('libs\\\\com.android.vending.expansion.zipfile.jar')
implementation files('libs\\\\okhttp-3.12.7.jar')
implementation files('libs\\\\okio-1.15.0.jar')
修改build.gradle文件。主要是externalNativeBuild和sourceSets。
plugins
id 'com.android.application'
RES_PATH = RES_PATH.replace("\\\\", "/")
COCOS_ENGINE_PATH = COCOS_ENGINE_PATH.replace("\\\\", "/")
android
compileSdk 32
defaultConfig
applicationId "com.mh.myapplication"
minSdk 21
targetSdk 32
versionCode 1
versionName "1.0"
externalNativeBuild
cmake
version "3.10.2"
targets "cocos"
arguments "-DRES_DIR=$RES_PATH", "-DCOCOS_X_PATH=$COCOS_ENGINE_PATH", "-DANDROID_STL=c++_static", "-DANDROID_TOOLCHAIN=clang", "-DANDROID_ARM_NEON=TRUE", "-DANDROID_LD=gold"
cppFlags "-frtti -fexceptions -fsigned-char"
ndk abiFilters PROP_APP_ABI.split(':')
buildTypes
release
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
compileOptions
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
sourceSets.main
java.srcDirs "../src", "src"
res.srcDirs "../res", 'res'
jniLibs.srcDirs "../libs", 'libs'
assets.srcDir "$RES_PATH/assets"
jniLibs
externalNativeBuild
cmake
path "../CMakeLists.txt"
buildStagingDirectory "$RES_PATH/proj/build"
dependencies
implementation fileTree(dir: '../libs', include: ['*.jar','*.aar'])
implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])
implementation project(':libservice')
implementation project(':libcocos')
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.5.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
implementation files('libs\\\\com.android.vending.expansion.zipfile.jar')
implementation files('libs\\\\okhttp-3.12.7.jar')
implementation files('libs\\\\okio-1.15.0.jar')
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
这里路径指向了Cocos项目以及Cocos的安装路径,这些内容可以拷贝出来,放到项目中也是可以的。
四、运行
添加权限和meta-data。
<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"/>
<meta-data
android:name="android.app.lib_name"
android:value="cocos" />
在MainActivity中添加一个按钮,新建一个TestActivity继承自CocosActivity。
public class TestActivity extends CocosActivity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
SDKWrapper.shared().init(this);
public class MainActivity extends AppCompatActivity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
Intent intent = new Intent();
intent.setClass(MainActivity.this,TestActivity.class);
startActivity(intent);
);
这样运行,点击按钮,就可以启动Cocos的画面了。
以上是关于Android项目中嵌入Cocos游戏项目的主要内容,如果未能解决你的问题,请参考以下文章