自社製ミドルウエアをDalvikと連携させることが可能になる AndroidをJNIするメリット 自社製ミドルウエアをDalvikと連携させることが可能になる lib××
たとえば Android体重計を作る場合 Linuxのミドルウエアとして実装されている体重計制御プログラムをJavaからたたけるようにする。
adbでso形式ファイルをpushしandroidに登録 JniによるNative連携 Javaコードを作成 JavaコードをBuild javahでJni用ヘッダーを作成 Cコードを作成 Cコードをコンパイルしリンク adbでso形式ファイルをpushしandroidに登録
ライブラリのロード Jniインターフェース Javaコードの作成 com.gclue.android.ET2008.NativeAdd.java package com.gclue.android.ET2008; import android.util.Log; public class NativeAdd { static { try { System.loadLibrary("NativeAdd"); } catch (Throwable e) { Log.e("TestJNI", e.toString()); } public native int readRfcomm2(byte[] array); ライブラリのロード Jniインターフェース
JavaコードをBuild NativeAdd.java javac NativeAdd.class
com_gclue_android_ET2008_NativeAdd.h javahでJni用ヘッダーを作成 NativeAdd.class javah public native int readRfcomm2(byte[] array); com_gclue_android_ET2008_NativeAdd.h javah -classpath C:\android_seminar\ET2008\bin com.gclue.android.ET2008.NativeAdd
javahでJni用ヘッダーを作成 com_gclue_android_ET2008_NativeAdd.h /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_gclue_android_ET2008_NativeAdd */ #ifndef _Included_com_gclue_android_ET2008_NativeAdd #define _Included_com_gclue_android_ET2008_NativeAdd #ifdef __cplusplus extern "C" { #endif /* * Class: com_gclue_android_ET2008_NativeAdd * Method: readRfcomm2 * Signature: ([B)I */ JNIEXPORT jint JNICALL Java_com_gclue_android_ET2008_NativeAdd_readRfcomm2 (JNIEnv *, jobject, jbyteArray); #ifdef __cplusplus } #endif #endif
Cコードを作成 com_gclue_android_ET2008_NativeAdd.c #include "com_gclue_android_ET2008_NativeAdd.h" #include <stdio.h> #include <sys/file.h> JNIEXPORT jint JNICALL Java_com_gclue_android_ET2008_NativeAdd_readRfcomm2 (JNIEnv *env, jobject object, jbyteArray array) { /* 処理を記述 */ return 1; }
com_gclue_android_ET2008_NativeAdd.cをコンパイル com_gclue_android_ET2008_NativeAdd.h arm-none-linux-gnueabi-gcc.exe LinuxのJavaのフォルダのinclude以下 を使用。 com_gclue_android_ET2008_NativeAdd.o arm-none-linux-gnueabi-gcc.exe -I.\include -I.\include\linux -fpic -c com_gclue_android_ET2008_NativeAdd.c arm-none-linux-gnuebi-gccは、下記URLよりダウンロード。 http://www.codesourcery.com/gnu_toolchains/arm/portal/subscription?@template=lite
arm-none-linux-gnueabi-ld.exe リンク arm-none-linux-gnueabi-ld.exe -T armelf_linux_eabi.xsc -shared -o libNativeAdd.so com_gclue_android_ET2008_NativeAdd.o armelf_linux_eabi.xsc はarm-none-linux-gnuebi-gcc, arm-none-linux-gnuebi-ldをインストールしたフォルダの「\Sourcery G++ Lite\arm-none-linux-gnueabi\lib\ldscripts」に格納されている。
com.gclue.ET2008.NativeAdd.class com_gclue_android_ET2008_NativeAdd.h 生成したファイル com.gclue.ET2008.NativeAdd.java com.gclue.ET2008.NativeAdd.class com_gclue_android_ET2008_NativeAdd.h com_gclue_android_ET2008_NativeAdd.c com_gclue_android_ET2008_NativeAdd.o libNativeAdd.so
libNativeAdd.soを/system/libに登録 Androidへ登録 libNativeAdd.soを/system/libに登録 libNativeAdd.so /system/lib adb push libNativeAdd.so /system/lib
Javaから呼び出し NativeAdd lib = new NativeAdd(); int len; byte[] buf = new byte[1024]; len = lib.readRfcomm2(buf);