【Android Studio】NDKを使ってHelloWorld_自動ビルド【日本語】

この度、NDKを使う機会が出てきたので、AndroidStudioでNDKを使ってHelloWorldを表示させる備忘録です。

尚、この記事はCMakeを使い、自動でビルドしてます。

CMakeを使わず手動でndk-buildを使ってビルドする場合はこちらをご参照ください。

 

他のプログラミングに関する記事はこちら

スポンサーリンク


 

【前提:NDKとは】

手動でビルドする場合に記載があるので、興味があればそちらをご参照ください。

 

【前提:なぜNDKを使うのか】

手動でビルドする場合に記載があるので、興味があればそちらをご参照ください。

 

【NDKでHelloWorld】

それでは早速、NDKを使ってHelloWorldを表示させてみます。

以下の手順で説明していきます。

 

・NDKの導入
・CMakeの導入
・実際に作っていく

 

【NDKの導入】

手動でビルドする場合に記載があるので、そちらをご参照ください。

恐らくパスを通すところまでやる必要がある……と思われます。

必要ないかもしれませんが。

 

【CMakeの導入】

まずはじめに、自動ビルドの場合はCMakeというライブラリをAndroid Studioにインストールする必要があります。

ので、まずはそのインストール方法から。

 

1.画面上部の「Tools」>「SDK Manager」をクリックします。

 

2.「Android SDK」タブ>「SDK Tools」タブ>「CMake」にチェック>「Apply」をクリックします。

 

以上でCMakeがインストールされます。

 

【実際に作っていく】

CMakeをインストールしたらNDK(自動ビルド)の使用準備が整うので、実際にHelloWorldと表示させるアプリを作っていきます。

 

1.新規プロジェクトを作成し、テンプレートで「Native C++」を選択して「Next」をクリックします。

 

2.適当なNameをつけて、「Next」をクリックします。

 

3.次に出る以下画面ではデフォルト設定のまま「Finish」をクリックします。

 

4.プロジェクトが作成されたら、C言語で「Hello World!!」と返す関数を作成していきます。

「cpp」を右クリック>「New」>「C/C++ Source File」をクリックします。

 

5.Nameに「helloWorld」と入力し「OK」をクリックします。

 

6.前手順で作成したファイルに、以下コードを入力します(エラーが出ると思いますが、特に気にしないでよいです)

この時、関数名の設定が重要なポイントとなります(後述)

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

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_ndk2_MainActivity_stringHelloWorld(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello World!!";
    return env->NewStringUTF(hello.c_str());
}

 

【関数名について】

関数名(5行目の記述)は、以下のルールで設定してください。

Java_[パッケージ名]_[呼び出し元のアクティビティ名]_[関数名]

 

今回の例でいうと、Java_com_example_ndk2_MainActivity_stringHelloWorldと記載していますが、

Javaは固定……お決まりの文字列です。

com_example_ndk2はパッケージ名の.を_に変えたものです。

パッケージ名は適当なアクティビティを開き、一番上に表示されているpackageを見ればわかります。

MainActivityは呼び出したいアクティビティ名です。

今回はMainActivityから呼び出す予定なので、MainActivityとしています。

stringHelloWorldは関数名です(ここは自由に設定していい)

 

7.前手順で作成した関数をライブラリとして登録します。これをしないとJava側から呼び出せません。

「CMakeLists.txt」>既にある「add_library」の下に追加で「add_library」を設定し、「helloWorld SHARED helloWorld.cpp」と入力します。

※とりあえず「[ライブラリとして呼び出すときの名称] SHARED [参照先のファイル名(相対パス)]」みたいに入力すればOKです

 

8.MainActivityクラスで、新しく作成した「helloWorld」ライブラリを呼び出します。

既にNative C++テンプレートで作成した場合、サンプルとして「native-lib」ライブラリを呼び出しています。

その下に、それぞれ記述を追加しています(6,17,25行目が追加されている部分)

public class MainActivity extends AppCompatActivity {

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
        System.loadLibrary("helloWorld");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Example of a call to a native method
        TextView tv = findViewById(R.id.sample_text);
        tv.setText(stringFromJNI());
        tv.setText(stringHelloWorld());
    }

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

 

9.この状態でアプリを起動すると、helloWorld.cppに設定している「HelloWorld!!」という文字が表示されるかと思います。

 

他のプログラミングに関する記事はこちら

スポンサーリンク