2回の記事では、我々は、Linuxカーネル空間とユーザー空間でのハードウェア抽象化層界面でのカーネルドライバを実装する方法を含め、Androidシステムのハードウェアのドライバを作成する方法を説明しました。両方の目的は、より上の界面層にアクセスするためのハードウェアを提供することで達成するために、それは、Androidアプリケーションフレームワーク層は、ハードウェア・サービスを提供しています。私たちは、AndroidのシステムからアプリケーションはJavaで書かれていることを知っており、ハードウェアドライバは、JavaインターフェースはCインタフェースにそれをアクセスする方法、そして、達成するためにC言語を使用していますか?我々はすべて知っているように、JavaのJNIは、Androidシステムでは、JavaアプリケーションがJNIを通してハードウェア抽象化レイヤのインタフェースを起動するには、同様に、メソッド呼び出しを提供します。この記事では、Javaアプリケーションの上位層は、基盤となるハードウェアが提供するサービスを利用するように、Androidのハードウェア抽象化レイヤのためのインタフェースJNIメソッドを作成する方法を紹介します。
「Androidシステムのソースコードのシナリオ分析、」攻撃プログラマ・ネットワーク(下のブックhttp://0xcc0xcd.comシリアルで)、入力するためにクリックしてください!
参照Androidのハードウェアアブストラクションレイヤ(HAL)にアクセスするためのLinuxカーネルドライバモジュール用のUbuntuの増加 Androidシステムイメージファイルが既にhello.default system.imgモジュールが含まれていることを確認するファイルを準備ハードウェアアブストラクションレイヤモジュール。
第二のフレームワーク/ベース/サービス/ JNIディレクトリに、com_android_server_HelloService.cppファイルを作成します。
USER-NAMEの@ MACHINE-NAME:〜/アンドロイド$ CDのフレームワーク/ベース/サービス/ JNI
USER-NAMEの@ MACHINE-NAME:〜/アンドロイド/フレームワーク/ベース/サービス/ JNI $ viのcom_android_server_HelloService.cpp
com_android_server_HelloService.cppドキュメントでは、JNIメソッドを実装します。注意コマンドファイルは、com_android_server接頭辞は、パッケージ名は、ハードウェアのサービスHelloServiceがコマンドcom.android.serverがあることを、COMフレームワーク/ベース/サービス/ javaのディレクトリ/アンドロイド/サーバーディレクトリの下に置かれていることを示しています。 HelloServiceクラス。ここで、我々はHelloServiceクラスを記述を省略している、次の記事では、我々はHelloServiceクラスに戻ります。簡単に言えば、HelloServiceはJavaインタフェースは、ハードウェアアクセスサービスクラスを提供しています。
最初は、適切なヘッダファイルを含めることです。
-
#定義 LOG_TAG "HelloService"
-
#が含まれ 、 "jni.h中を"
-
#が含まれ 、 "JNIHelp.hを"
-
#が含まれ 、 "android_runtime / AndroidRuntime.h"
-
#が含ま <utilsの/ misc.h>
-
#が含ま <utilsの/ LOG.H>
-
#が含ま <ハードウェア/ hardware.h>
-
#が含ま <ハードウェア/ hello.h>
-
#含める <stdio.hに>
その後hello_init、hello_getValとhello_setVal 3 JNIメソッドを定義します。
-
名前空間の
アンドロイド
-
{
-
/ *ハードウェア・アクセス・ハードウェア抽象化レイヤで定義された構造、リファレンス<ハードウェア/ hello.h> * /
-
構造体 hello_device_t * hello_device = NULL ;
-
ハードウェア抽象化レイヤヴァル定義された値によって提供される/ *ハードウェア・アクセス・インターフェースのハードウェア・レジスタ* /
-
静的 ボイド hello_setVal (JNIEnvの* ENV、jオブジェクトclazz、JINT値)
{
-
int型
のval =値;
-
LOGI("こんにちはJNI:デバイスへの設定値%D" 、ヴァル)。
-
もし
{(!のhello_device)
-
LOGI("こんにちはJNI:デバイスが開いていません。");
-
返します
。
-
}
-
-
hello_device-> set_val(hello_device、ヴァル)。
-
}
-
/ *の値によって定義されたハードウェアレジスタアクセスインターフェースハードウェアヴァルハードウェアアブストラクションレイヤを読みます* /
-
静的 JINT hello_getVal (JNIEnvの* ENV、jオブジェクトclazz)
{
-
int型
のval =
0
;
-
もし
{(!のhello_device)
-
LOGI("こんにちはJNI:デバイスが開いていません。");
-
返す
のvalを。
-
}
-
hello_device-> get_val(hello_device、&val)で、
-
-
LOGI("こんにちはJNI:デバイスからの値%dを取得する。"、ヴァルを)。
-
-
返す
のvalを。
-
}
-
ハードウェアモジュールのハードウェアを開くために、オープンインタフェースを定義/ *ハードウェアアブストラクションレイヤ* /
-
静的 インライン int型 hello_device_open (CONST hw_module_t * モジュール、構造体hello_device_t **デバイス)
{
-
リターン・
モジュール
- > methods->オープン(
モジュール
、HELLO_HARDWARE_MODULE_ID、(構造体
hw_device_t
**)デバイス)
-
}
-
指定されたハードウェア抽象化レイヤモジュールとオープン・ハードウェアをロードする/ *ハードウェアモジュールID * /
-
静的 jboolean hello_init (JNIEnvの* ENV、JCLASSのclazz)
{
-
hello_module_t
*
モジュール
。
-
-
LOGI("こんにちはJNI:初期化......");
-
もし
(hw_get_module(HELLO_HARDWARE_MODULE_ID、(
CONST
構造体
hw_module_t
**)&
モジュール
)==
0
){
-
LOGI("こんにちはJNIは:こんにちはスタブが見つかりました。");
-
もし
(hello_device_open(&(
モジュール
- >一般的)、およびhello_device)==
0
){
-
LOGI("こんにちはJNIは:こんにちはデバイスがオープンしています。");
-
リターン
0
;
-
}
-
LOGE("こんにちはJNIは:こんにちは、デバイスのオープンに失敗しました。");
-
返す
-1
;
-
}
-
LOGE(「こんにちはJNIは:こんにちはスタブモジュールを取得できませんでした。」);
-
返す
-1
;
-
}
-
/ * JNIメソッドテーブル* /
-
静的
CONSTは
JNINativeMethod method_table [] = {
-
{ "init_native" 、 "()Z" 、( ボイド *)hello_init}
-
{ "setVal_native" 、 "(I)V" 、( ボイド *)hello_setVal}
-
{ "getVal_native" 、 "()I" 、( ボイド *)hello_getVal}
-
}。
-
/ * JNIメソッドを登録します* /
-
int型 register_android_server_HelloService (JNIEnvの* ENV)
{
-
返す
jniRegisterNativeMethods(ENVを、
"COM /アンドロイド/サーバー/ HelloService"
、method_table、nelem個(method_table));
-
}
-
}。
hello_init関数で、なお、前記ロードモジュールIDのHELLO_HARDWARE_MODULE_IDハードウェア抽象化レイヤモジュールのハードウェア抽象化層によって提供hw_get_moduleアンドロイド方法HELLO_HARDWARE_MODULE_IDが<ハードウェア/ hello.h>の中で定義されます。アンドロイドは、ハードウェア抽象化層をベースシステムのAndroid /システム/ HW / libディレクトリのHELLO_HARDWARE_MODULE_ID値に対応するモジュールを検索し、それらをロードし、発信者hw_module_t使用にインターフェイス戻ります。jniRegisterNativeMethods関数において、第二のパラメータの値は、パッケージに対応するパス、すなわちcom.android.server.HelloService、HelloServiceを配置しなければならないです。
3つの第1、同じディレクトリ内のファイルを変更onload.cpp名前空間アンドロイド増加register_android_server_HelloService関数宣言に:
名前空間のアンドロイド{
.................................................. ............................................
int型register_android_server_HelloService(JNIEnvの* ENV);
}。