Android StudioでJavaからC++を呼び出すデモを作成する方法

概要:

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++層への呼び出しが正常に動作していることが確認できます。

タグ: android-studio JNI cpp ndk java-native-interface

7月8日 20:58 投稿