Android NDKでC/C++側からJavaメソッドを呼び出す

Android NDK では次の両方ができます。

  • Java側からC/C++関数を呼び出す
  • C/C++側からJavaメソッド呼び出し

前者はググればやり方がたくさん出てきます。

ただ後者の情報が分かりにくい...

それならばということで、
C/C++側からJavaメソッドを呼出方法 をまとめました。

その手順をまとめておこうと思います。

手順0.Android NDKからC/C++の導入手順

ここでは省略。

詳しくは次ページを見てください。

大まかな手順だけなら こういう感じです。

  1. C/C++ を既存プロジェクトに追加
  2. CMakeLists.txtにビルド設定を追加
  3. モジュール側のbuild.gradleを編集
  4. C/C++でネイティブメソッドを定義
  5. Javaからネイティブメソッド呼び出し

手順だけだとスゴク複雑に感じる・・・

でも基本手順さえ押さえとけば難しくありません。

手順1.C/C++から呼びだすJavaメソッドを定義

ここでは次の MainActivity を用意しました。

▼ MainActivityの簡易的コード

ここには次2つのメソッドがあります。

  • sendNameToJni
    C++側で定義されているネイティブメソッド。この関数はString型の引数1つ持ち、String型の返り値をかえす。それからネイティブメソッドにはnative装飾子も必要。
  • receiveFromJni
    C++側から呼びだしされるMainActivityのJavaメソッド。 sendNameToJni  の内部で呼ばれるような使い方をされる(後述)

MainActivity側はこういうコード

ここまでは特殊な手順は必要ありません。

手順2.C/C++コードからJavaメソッド実行

ここでは次の条件でネイティブメソッド定義しました。

  • ソースは app.cpp のファイル名
  • コード・関数定義にはC++を使用
  • 外部ライブラリは一切使わない

ここでは std::string  など使うのでC++導入済み。

ただしC++導入は必須ではありません。(C言語でもOK)

 

この条件で次のネイティブメソッドを定義しました。

▼ app.cppにて次の関数を定義

大事なのはハイライトした部分。

大まかな流れとしては 1. (*end).FindClass  からMainActivityクラスを取得 => 2. (*env).GetMethodId  にクラス・メソッド名・返り値と引数の型を渡してメソッドID取得 => 3. (*env).CallObjectMethod  からJavaメソッド呼び出し。

こうなってます。少し面倒かもしれない。

ただ基本手順さえ分かれば難しくないです。

あと次のポイントにも要注意ですね。

  1. Cとしてexportすること
  2. 関数名の命名規則

この2つは必ず守ってください。(特にC++)

C/C++からのJavaメソッドの呼出手順まとめ

簡単にここまでの流れをまとめ

  1. Android NDKからC/C++の導入手順
  2. C/C++から呼びだすJavaメソッドを定義
  3. C/C++コードからJavaメソッド実行

以上、NDK C/C++からJavaメソッド呼出しでした。

間違いがあればご指摘ください。ではまた($・・)/~~~