時には立ち止まってみるのもいいよ

仕事の合間の息抜き。やってることは仕事と同じ。

AndroidStudio 1.4 + JNI

AndroidStudio1.4でJNIをつかう方法の覚書。

1.3版を書いてる間に1.4がリリースされたのでその辺の記述も。

ってほとんど同じですけd。

 

元ネタはこちら→

Experimental Plugin User Guide - Android Tools Project Site

 

 

1. experimentalなプラグインが必要。

NDKをつかうためのプラグインはGradle2.5が必要なので、その辺も含めて設定をいろいろいじります。何かダウンロードしてインストールする、というわけではありません。

Gradle2.5 + NDK r10e + SDK Build Tools 19.0.0以上が必要です。

  • {PROJDIR}/gradle/wrapper/gradle-wrapper.propertiesファイルを編集して、distributionUrlをgradle-2.5に変更する
    変更後)
      distributionUrl=https\://services.gradle.org/distributions/gradle-2.5-bin.zip
  • {PROJDIR}/build.gradleのクラスパスを変更する
    変更後)
      classpath 'com.android.tools.build:gradle-experimental:0.2.0'
  • {PROJDIR}/.idea/gradle.xmlにgradleHomeオプションがあれば、消す。
    変更前)
    <option name="gradleHome" value="C:\Program Files\Android\Android Studio\gradle\gradle-2.4" />
    ※これに気が付くのにえらい時間がかかった。。
2. Gradle Scripts の変更

元ネタサイトのまとめを適当に日本語化すると、こんな感じ。

  • プラグイン名を"com.android.model.application"に変更する
  • 設定は model {} で囲む
  • ほとんどのプロパティは = で記述する(以前はスペースのみ)
  • Collectionへの追加は += で記述する(proguardんとこの話)

が、いくつか限定条件があって、

  • buildTypes, productFlavors, signingConfigs は android{} ブロックの外に出す
  • android {}ブロックの中にネストされている項目には with キーワードをつける
  • プロパティ値として設定できるのは direct types のみ。
    ※ minSdkVersionとかproGuardFilesの話だと思います。
  • buildTypeやproductFlavorを作成するには create メソッドを使う必要がある。
    ただしrelease buildTypeのような既存のものは名前を指定するだけで使える。
  • dependencyのtestCompileコマンドは使えないようだ。
    ※ AndroidStudio1.4でやるとdependenciesにtestCompileが追加されますが、エラーで通りませんでした。よくわからんのでコメントアウト(^^; いいのか?

 

で、デフォルトのプロジェクトを書き換えたbuild.gradleがこちら。

apply plugin: 'com.android.model.application'

model {
    android {
        compileSdkVersion = 23
        buildToolsVersion = "23.0.0"

        defaultConfig.with {
            applicationId = "jp.poiuy56.project"
            minSdkVersion.apiLevel = 19
            targetSdkVersion.apiLevel = 23
            versionCode = 1
            versionName = "1.0"
        }
    }
    android.buildTypes {
        release {
            minifyEnabled = false
            proguardFiles += file('proguard-rules.pro')
        }
    }

}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    //testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.android.support:design:23.0.1'
}

 

ここらで一度Gradleを同期してみて、ビルドが通るか確認します。

Gradle-2.5 が読まれていれば、 {PROJDIR}/.gradle/2.5 が出来上がってファイルが配置されてるはずです。

 

3. Gradle Scripts (NDK用の追加設定)
  • {PROJDIR}/local.propertiesにndk.dirを追加。
    SDKLocationで設定すると追加されます。
    ndk.dir=C\:\\android-ndk-r10e
    sdk.dir=C\:\\android-sdk-windows
  • {PROJDIR}/app/build.gradle に android.ndk ブロックを追加
    android.ndk {
    moduleName = "jni-sample"
    CFlags += "-UNDEBUG"
    ldLibs += ["android","log"]
    stl = "stlport_static"
    }
4. JNIソースを追加する
  • appから右クリックで new -> Folder -> JNI Folder でjniフォルダを作成
  • jniフォルダに .c とかを置けばOK

後は普通にJNIですね。nativeメソッドを含むjavaクラスを作って、javahでヘッダ生成、んで中身を実装してjniフォルダに配置すれば、うまくやってくれます←

 

JNIのモジュールを複数に分けたりフォルダを分けたりする方法がよくわからんので今後の課題です。