Help us understand the problem. What is going on with this article?

Android NDK で Hello World 表示してみる

プロジェクト作成

普通にプロジェクトを作成する

NDKのインストール

Tools -> SDK Manager -> SDK Tools から NDK を選択し、インストールする
スクリーンショット 2020-02-01 22.34.46.png

ndk-build へのパスを通す

~/.bash_profile
export PATH=$PATH:/Users/{ユーザー名}/Library/Android/sdk/ndk/21.0.6113669

2020年2月現在、上記のようなパスにインストールされるもよう
ターミナルで source ~/.bash_profile を実行後、 ndk-build コマンドを実行しパスが通っていることを確認する

jniフォルダの作成

以下のようなパスで jni フォルダを作成する
スクリーンショット 2020-02-01 22.14.00.png

C言語のソースコードを作成する

jniフォルダの下に以下のようなC言語のソースコードを作成する

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

jstring Java_develop_tomo1139_ndkhelloworld_MainActivity_helloWorld(JNIEnv* env, jobject javaThis) {
    return (*env)->NewStringUTF(env, "Hello World!!");
}

関数名は Java _ {この関数を呼び出すクラスのパッケージ名} _ {この関数を呼び出すクラス名} _ {Kotlinから呼び出す際の関数名} となる

mkファイルの作成

jniフォルダの下に以下のようなmkファイルを作成する

Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE    := hello
LOCAL_SRC_FILES := hello.c

include $(BUILD_SHARED_LIBRARY)

C言語プログラムのビルド

ターミナルでjniフォルダの下へ移動し ndk-build コマンドを実行する
ビルドに成功すると *.so ファイルが生成される
スクリーンショット 2020-02-01 22.23.38.png

フォルダの指定

build.gradle
android {
    defaultConfig {
        ...
        sourceSets {
            main {
                jni.srcDirs = []
                jniLibs.srcDir "src/main/libs"
            }
        }
    }
}

KotlinからC言語の関数を呼び出す

MainActivity.kt
class MainActivity : AppCompatActivity() {

    private external fun helloWorld(): String // 関数宣言の追加

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        Log.d("dbg", helloWorld()); // 実行
    }

    companion object {
        init {
            System.loadLibrary("hello") // ライブラリのロード
        }
    }
}

実行結果

KotlinからC言語の関数を呼び出し Hello World!! と表示できた :ok_woman:
スクリーンショット 2020-02-01 22.31.09.png

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした