C/C++を使う方法ですが、ndk-build(古い)を使う方法とCMake(新しい)を使う方法があるようで、今回はCMakeを使う方法です。これらの具体的な仕組みは分かりませんが、これをつかって規則に沿って進めていけばうまくビルドしてくれるようです。便利なもんだ。
Androidでググっていると、ネイティブコードとかいう言葉をよく目にすることがあるかもしれません。C/C++がそれにあたるそうです。使い方ですが、Android StudioのSDKツールでLLDB、CMake、NDKという3個のコンポーネントを追加してください。横着な人はプロジェクト作成のときにこの部分
Include C++ Suportにチェックを入れて作業を進めて行くと、〇〇がないからインストールしなよ!
って出て来るので、それで入れて進めても大丈夫です。
さて、MinimumSDKとかどうしよかなーとか悩むとこですが、テストなのでそれは置いておいてドンドン進めて行くと、普段見ないファイルが少し増えているぞと。
cppディレクトリにnative-lib.cpp、External Build FilesにCmakeLists.txt というファイルがあるね。
C/C++を使う方法ですが、ndk-build(古い)を使う方法とCMake(新しい)を使う方法があるようで、今回はCMakeを使う方法です。
これらの具体的な仕組みは分かりませんが、これをつかって規則に沿って進めていけばうまくビルドしてくれるようです。
便利なもんだ。
プロジェクトが出来上がって何も手を加えずにビルドしてみてみると、native-lib.cppにあるString設定されている文字列がディスプレイに表示されていることでしょう。
いつものJavaのMainActivityを見ると
public native String stringFromJNI(); static { System.loadLibrary("native-lib"); }
というところがあります。nativeで宣言して、下の3行でCを呼んでる感じだね。
C++のコードはnative-lib.cppに書くとよさそうです。
では、ここで積み本になっていた技術評論社:C++クラスと継承完全制覇を取り出してC++のコードを書いてみよう。
と、その前にルールをチェックやで。
native-lib.cpp
Java_net_tjapps_testc_MainActivity_stringFromJNI( JNIEnv* env, jobject /* this */) {
メソッドはこの形式で、第1引数、第2引数はこれで固定らしい。追加は第3から。
あとはDEMO?というか作りたてのコードにあったようにC++内部ではstd::stringで、返す時にはJstring。
これはStringだけども、このような感じのルールらしい。
プロジェクトを生成してできるコードを見るとそのようになっています。
では技術評論社:C++クラスと継承完全制覇のList1-1のコードから抜き出してビルドします。
#include <jni.h> #include <string> extern "C" JNIEXPORT jstring JNICALL Java_net_tjapps_testc_MainActivity_stringFromJNI( JNIEnv* env, jobject /* this */) { struct Jugyoin { int number; char shimei[80]; long kyuyo; }; struct Jugyoin tanaka; tanaka.number = 1234; strcpy(tanaka.shimei, "田中一郎"); tanaka.kyuyo = 200000; return env->NewStringUTF(tanaka.shimei); }
こんな感じになっています。
ビルドすると
出たけどちょっと寂しい。
ではこの勢いでC++の勉強をしていこうと思います。
せっかく本買ったしなあ、とけっこう貧乏性なんだな。
と、最後の更新からずいぶんと日が空いてしまいました。久しぶりの更新です。
最近まで続けていた英語のアウトプットの方はMyTeacherがCheckしてくれることになったので、こっちは昔の感じで書いてこうかなと思います。やっぱり英語+ITの話題となると、ちょっと敷居も高くなっちゃってなかなか手が動かなかなったんですが、ただの英語の日記だとわりとサクサクと書けますね。それに添削もしてくれるのでやりがいもあるとな。
参考にしたサイト
させす技術メモ(自家用)Android Studio 2.2でC++のコードを使う
hcreer’s diary Android Studio NDKを使う