Env
- macOS 10.11.3
- cocos2d-x 3.13
- Android Studio 2.2
- Android SDK Tools 25.2.2
- Android SDK Platform-tools 24.0.3
- Android SDK Build-tools 24.0.0
- Android NDK r10e
- 404KC Android 4.4.4(実機)
前提条件としてすでにcocos2dプロジェクトを作成していること
また、AndroidSDKやNDKもインストール済みであること
SDKのインストール方法については過去記事参照
NDKは下記URLからダウンロード可能
Step
1. Android Studioにcocosプロジェクトを取り込む
取り込んだ後gradleをビルド中にcocosが使っている
gradleがかなり古いので更新しますか?と聞いてくる
これはどっちでもいいけど、
一応最新にアップデートしてみた
ちなみにこんなこと聞かれたら、
AndroidStudioとバージョン管理システムが、
連携していないということなので、連携させる
メニューの
VCS -> Enable Version Control Integration...
から
Gitを選択(Gitを使用している場合)
2. SDKとNDKのパスを通す
SDKのパスを通す
Preferences(⌘,) -> Appearance & Behavior -> System Settings -> Android SDK
NDKのパスを通す
Project Structure(⌘;) -> SDK Location
3. build.gradleを編集する
現状のbuild.gradleではNDKのビルドをやってくれないため、
APKをビルドしても動かない
そのため、build.gradleないでNDKビルド設定を記述する
また、リソースもコピーされないため、
アセットフォルダにコピーするタスクも追加する
ちなみにNDKのモジュールパスと
アセットにコピーするリソースのパスは
build-cfg.json
から取得するようにしたため、
変更する場合は、そちらを変更すること
build-cfg.jsonはデフォルトで作られる
(おそらくcocosコマンドで使用される?)
apply plugin: 'com.android.application'
import org.apache.tools.ant.taskdefs.condition.Os
import groovy.json.JsonSlurper
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "org.cocos2dx.GameBase"
minSdkVersion 10
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
sourceSets.main {
jni.srcDirs = []
java.srcDir "src"
res.srcDir "res"
jniLibs.srcDir "libs"
manifest.srcFile "AndroidManifest.xml"
assets.srcDir "assets"
}
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
}
}
}
task createAssets << {
def jsonSlurper = new JsonSlurper()
def text = new File('build-cfg.json')
def root = jsonSlurper.parseText(text.getText())
def resourceId = 0
def copyResource = { resource ->
def taskName = "copyResource$resourceId"
tasks.create(name: taskName, type: Copy) {
from "$rootDir/" + resource.from.toString()
into "assets/" + resource.to.toString()
}
tasks.findByName(taskName).shouldRunAfter createAssets
resourceId += 1
}
root.copy_resources.each { resource ->
copyResource(resource)
}
root.must_copy_resources.each { resource ->
copyResource(resource)
}
}
task buildNative(type: Exec, dependsOn: createAssets, description: 'Compile JNI source via NDK') {
android.applicationVariants.all { variant ->
commandLine getNdkBuildCmd(),
"NDK_OUT=$buildDir/intermediates/ndk/${variant.dirName}/obj",
"NDK_LIBS_OUT=$buildDir/intermediates/ndk/${variant.dirName}/lib",
"NDK_MODULE_PATH=" + getNdkModulePath()
copy {
from "$buildDir/intermediates/ndk/${variant.dirName}/lib"
into "libs"
}
}
}
task cleanNative(type: Exec, description: 'Clean JNI object files') {
android.applicationVariants.all { variant ->
commandLine getNdkBuildCmd(),
"NDK_OUT=$buildDir/intermediates/ndk/${variant.dirName}/obj",
"NDK_LIBS_OUT=$buildDir/intermediates/ndk/${variant.dirName}/lib",
"NDK_MODULE_PATH=" + getNdkModulePath(),
'clean'
}
}
clean.dependsOn 'cleanNative'
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn buildNative
}
lintOptions {
abortOnError false
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':libcocos2dx')
}
def getNdkBuildCmd() {
def ndkDir = android.ndkDirectory.toString()
if (ndkDir == null) {
throw new GradleException("NDK location not found. Define location with ndk.dir in local.properties.")
}
def ndkBuildCmd = ndkDir + '/ndk-build'
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
ndkBuildCmd += '.cmd'
}
return ndkBuildCmd
}
def getNdkModulePath() {
def jsonSlurper = new JsonSlurper()
def text = new File('build-cfg.json')
def root = jsonSlurper.parseText(text.getText())
def ndkModulePath = '.'
root.ndk_module_path.each { module ->
ndkModulePath = "$ndkModulePath:$rootDir/" + module
}
return ndkModulePath
}
gradleを編集すると同期するか聞かれるので、
Sync Now
を選択
4. Gradleをインストール
この工程がいるかどうかわからないけど、
一応ターミナルでgradlewを直接叩いてGradleをインストールする
$ ./gradlew
5. APKをビルド
メニューの
Build -> Build APK
からAPKをビルドする
6. APKをインストール
Build Successしたら、
adbコマンドを使用して実機もしくはシミュレータにインストールする
$ adb install -r app/build/outputs/apk/<PROJ_NAME>-Debug.apk
7. 実行
おなじみの画面が出たら成功
最後に
過去の記事でAndroidStudioをめちゃ叩いたけど、
実際ちゃんと使ってみたら全然Eclipseと桁違いほど使いやすかったので、
今までちゃんと触らなかった自分が恥ずかしい
cocos2d-xプロジェクトがAndroid Studioビルドできない時の対処
というかcocosはなぜcocosコマンドでビルドする前提になっているんだ?
proj.android-studioってプロジェクトがあるのに
それじゃ意味なくない?
とりあえずやり方をざっと書いたけど、
なんか足りない感じがするので
動かなかったら報告なり、質問いただけると助かります