概要:
AndroidアプリケーションでC++コードを実行する必要がある場合、JNI(Java Native Interface)を使用することで可能です。本稿では、Android StudioでJava/KotlinからC++関数を呼び出す基本的な実装手順を説明します。
環境準備:
事前にローカルマシンにAndroid NDKがインストールされている必要があります。NDKのインストールが完了していない場合は、公式ドキュメントを参照して設定を行ってください。
新規プロジェクトの作成:
Android Studioで新しいEmpty Projectを作成します。例として、プロジェクト名をNativeDemo、パッケージ名をcom.example.nativedemoとします。
C++サポートの追加:
プロジェクト作成後、srcディレクトリ内で右クリックし、「Add C++ to Module」を選択します。これにより、C++ビルド機能がプロジェクトに追加されます。
レイアウトファイルの設定:
activity_main.xmlファイルを開き、TextViewコンポーネントにid属性を追加します。以下のコード例を参照してください:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/display_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Initial Text"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Java側の実装:
MainActivity.javaファイルでネイティブライブラリの読み込みとnativeメソッドの宣言を行います:
package com.example.nativedemo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("nativelib");
}
public native String getMessageFromNative();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = findViewById(R.id.display_text);
textView.setText(getMessageFromNative());
}
}
C++側の実装:
native-lib.cppファイル(または任意のC++ファイル)にJNI関数を実装します。関数名はJava_パッケージ名_クラス名_メソッド名の形式に従います:
#include <jni.h>
#include <string>
extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_nativedemo_MainActivity_getMessageFromNative(
JNIEnv* env,
jobject this_object) {
std::string message = "Message from C++ Native Code";
return env->NewStringUTF(message.c_str());
}
実装の詳細説明:
- パッケージ名:com.example.nativedemo
- クラス名:MainActivity
- メソッド名:getMessageFromNative
上記の情報を組み合わせて、C++側の関数名が決定されます。6行目でC++の文字列を生成し、7行目でJNI文字列に変換して返しています。この戻り値がJava側のnativeメソッドの返回值として渡されます。
動作確認:
アプリケーションを実行すると、TextViewに「Message from C++ Native Code」というテキストが表示されます。これにより、Java層からC++層への呼び出しが正常に動作していることが確認できます。