Edited at

[cocos2d-x]AndroidStudioのみでNDKビルドする

More than 1 year has passed since last update.


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のインストール方法については過去記事参照

コマンドのみでAndroid SDKをインストール

NDKは下記URLからダウンロード可能

https://dl.google.com/android/repository/android-ndk-r10e-darwin-x86_64.zip


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コマンドで使用される?)


build.gradle

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ってプロジェクトがあるのに

それじゃ意味なくない?

とりあえずやり方をざっと書いたけど、

なんか足りない感じがするので

動かなかったら報告なり、質問いただけると助かります