2013年12月9日月曜日

android-ndk jniを使う

以前書いたndkのインストール及びテストの記事で最後のほうに空のプロジェクトが動いた、
とか書いたけど、改めて見直したら自分でもさっぱりなにをどうしたのか分からなかったので、
改めて適当なプロジェクトを作ってテストしてみた。

参考サイト
Android NDKを使った開発環境の構築

空のプロジェクトを作る


まずは環境だけが整ったプロジェクトを作る。
  1. メニューからAndroidApplicationProjectを作成する。
  2. プロジェクトを右クリック。「Androidツール」から「Add Native Suport」を選択
  3. 任意の名前を付けて「完了」。
これで環境だけが整った空のプロジェクトが完成。

jniファイルとの連携用のクラスを作成する


参考サイトではMainActivityに直接書き込んでいるけど、後述のjavahを使ったときに怒られた。
可読性もろもろのためにもネイティブと連携するファイルは個別にするのがいいと思う。

/*---------------------------------------------------------------------------*/
public class HogeJNI {
statis {
System.loadLibrary("hoge");
}
public static native void fuga();
}
/*---------------------------------------------------------------------------*/

System.loadLibraryには呼び出すsoファイルの名前を指定する。
C/C++のファイルと同じ名前になると思う。

C/C++のヘッダファイルを作成する


自分で打つと失敗する可能性大なので、jdkのjavahコマンドを使う。
コマンドプロンプトでプロジェクトのルートフォルダに移動して、以下のコマンドを実行。

/*---------------------------------------------------------------------------*/
$ javah -o jni/hogejni.hpp -classpath bin/classes com.example.test.HogeJNI
/*---------------------------------------------------------------------------*/

-oに出力先、-classpathに参照するクラスパス。最後が対象クラス。
詳しいことは参考サイトを見よう。
これでファイルが作成された。しかし、手動でインポートしないといけないの?
リフレッシュしてもいつまで経っても表示されないんだけども。

C/C++のソースファイルを作成


javahコマンドで作成したヘッダファイルをインクルード&そのまま使える部分をコピーして
ソースファイルに書き込み。
そのままコピペすると変数名を忘れる。
少なくとも自分は忘れた。30分以上、それに気づかず無駄にした。
C/C++側のエラーは感知してくれないんかね?

あとは必要なところでネイティブメソッドを呼び出せば動くはず。

0 件のコメント:

コメントを投稿