Android Studio 2.1でJNIを使って開発する手順です。
環境
- Windows 10
- Android Studio 2.1.1
プロジェクトの作成
Android Studioで新しいプロジェクトを作成します。
「Application name」と「Company Domain」を入力します。
ここでは、「Application name」を「JniTest」としました。
「Phone and Tablet」をチェックし、「Minimum SDK」を選択します。
「Empty Activity」を選択します。
「Activity Name」と「Layout Name」は初期値のままにします。
プロジェクトが作成されます。
メニューの「Run」→「Run ‘app’」を選択して、アプリケーションを実行できることを確認します。
Gradleの設定
メニューの「File」→「Settings」を選択し、「Build, Execution, Deployment」→「Build Tools」→「Gradle」を選択します。
「Use Default Gradle wrapper (recommended)」にチェックを入れ、「OK」ボタンを押します。
Android NDKのインストール
メニューの「Tools」→「Android」→「SDK Manager」を選択します。
「SDK Tools」タブを選択し、「Android NDK」をチェックします。。
「Apply」ボタンを押します。
License Agreement画面の「Accept」をチェックして、「Next」ボタンを押します
。
インストールが始まります。
メニューの「Run」→「Run ‘app’」を選択して、アプリケーションを実行できることを確認します。
build.gradle(Project)ファイルの編集
「build.gradle(Project: jnitest)」を開きます。
classpath 'com.android.tools.build:gradle:2.1.0'
の行を次のように変更します。
classpath 'com.android.tools.build:gradle-experimental:0.7.0'
gradle-wrapper.propertiesファイルの編集
「gradle-wrapper.properties (Gradle Version)」を開きます。
distributionUrl=…
の行を次のように変更します。
distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
build.gradle(Module)ファイルの編集
「build.gradle(Module: app)」を開きます。
次のように変更します。
apply plugin: 'com.android.model.application'
model {
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.3"
defaultConfig {
applicationId = "jp.gesource.jnitest"
minSdkVersion.apiLevel = 19
targetSdkVersion.apiLevel = 23
versionCode = 1
versionName = "1.0"
}
buildTypes {
release {
minifyEnabled = false
proguardFiles.add(file('proguard-android.txt'))
}
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
}
メニューの「Run」→「Run ‘app’」を選択して、アプリケーションを実行できることを確認します。
Android NDK locaationの設定
「File」→「Project Structure」→「SDK Location」を選択します。
「Android NDK locaation」が設定されていなければ、設定して「OK」ボタンを押します。
build.gradleの設定
build.gradle(Module: app)を開き、「buildTypes」の設定の下に「ndk」の設定を追加します。
buildTypes {
…
}
ndk {
moduleName = "jnitest"
}
MainActivityの編集
MainActivity.javaを開き、次の行を追加します。
static {
System.loadLibrary("jnitest");
}
public native String getMsgFromJni();
build.gradleのmoduleNameで設定した名前をSystem.loadLibraryの引数に設定します。
getMsgFromJni関数が存在しないため、getMsgFromJniの部分でエラーになっています。
カーソルをgetMsgFromJniの上に移動し、ALT+Enterキーを押します。
Enterキーを押すと、jniフォルダーにjnitest.cファイルが作成され、関数が作成されます。
#include <jni.h>
JNIEXPORT jstring JNICALL
Java_gesource_jp_jnitest_MainActivity_getMsgFromJni(JNIEnv *env, jobject instance) {
// TODO
return (*env)->NewStringUTF(env, returnValue);
}
jnitest.cのreturnValueの部分を編集します。
return (*env)->NewStringUTF(env, "Hello JNI");
res/layout/activity_main.xmlファイルを開き、TextViewのidを「jni_msgView」に設定します。
MainActivity.javaを開き、MainActivityクラスのonCreateメソッドの末尾に次の行を追加します。
((TextView) findViewById(R.id.jni_msgView)).setText(getMsgFromJni());
TextViewの部分がエラーになっているので、Alt+Enterキーを押して修正します。
メニューの「Run」→「Run ‘app’」を選択して、アプリケーションを実行できることを確認します。
C言語で記述した処理が実行されています。