[Android] 007. Native Library(NDK)

Native Libraryを新規作成して自動生成されたメソッドの呼び出しまでを試してみます

Android Native Library 作成

メニューのFile – New – New ModuleからAndroid Native Libraryを追加します
今回は既存のライブラリを想定して言語はJavaにしています

moduleにnativelibが追加され以下のコードが自動生成されます
nativelib/cpp/nativelib.cpp
/java/(package)/NativeLib.java

#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_nativelib_NativeLib_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}
package com.example.nativelib;

public class NativeLib {
    // Used to load the 'nativelib' library on application startup.
    static {
        System.loadLibrary("nativelib");
    }

    /**
     * A native method that is implemented by the 'nativelib' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();
}

呼び出し

Project Structureなどで作成したnativelibをimplementationします
DependenciesのModulesのappを選択してDeclared Dependenciesの+ボタンを押して3 Module Dependencyを選択
nativelibにチェックを入れてokボタンを押す

自動生成されたコードをkotlin側から呼び出ししてみます
Halloボタンを押すとLogcatに「Hello from C++」が表示されます

Column {
    val nativeLib = NativeLib()
    Button(onClick = { Log.d("TestApp", nativeLib.stringFromJNI()) }) {
        Text("Hello")
    }
}

kotlin

言語のkotlinにした場合は以下ようなのコードが自動生成されます
呼び出し方はJava版と同じです

package com.example.nativelib

class NativeLib {
    /**
     * A native method that is implemented by the 'nativelib2' native library,
     * which is packaged with this application.
     */
    external fun stringFromJNI(): String

    companion object {
        // Used to load the 'nativelib' library on application startup.
        init {
            System.loadLibrary("nativelib")
        }
    }
}

Jetpack Composeプロジェクトにc/c++サポート追加する方法

普通にAndroid StudioをインストールしていればNDKがインストールされているはずですが念のため確認

(project)/(module)/src/main/cppフォルダを作成してAndroid StudioのProjectのTree表示をProjectにしてcppフォルダを選択して右クリックメニューでNew – CMakeList.txtでCMakeList.txtを作ります

とりあえずCMakeList.txtに何も指定しなくても良いが以下を指定
※ cmake_minimum_requiredは適切なバージョンを指定
<project名>には”testndk”のように任意のプロジェクト名を指定してください

cmake_minimum_required(VERSION 3.4.1)

project(<project名>)

build.gradle.kts(Module)に以下を追加
これでcppフォルダがSorce Root認識されてProjectのTree表示をAndroidにしてもcppフォルダが見えるようになります
CMakeのversionを指定する場合はSDK ToolのShow Package Detalisを有効にしてインストールされているCMakeのバージョンを確認してください

あとは必要に応じた実装とCMakeList.txtの編集をしてください

android {
    externalNativeBuild {
        cmake {
            path = file("src/main/cpp/CMakeLists.txt")
        }
    }
}

Android Studio Giraffe 2022.3.1 built on June 29, 2023