Javaサービス・インターフェース(4)JNI方法書き込ま(HAL)モジュールAndroidのハードウェア抽象化層のためのUbuntuにハードウェアへのアクセスを提供

        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インタフェースは、ハードウェアアクセスサービスクラスを提供しています。

      最初は、適切なヘッダファイルを含めることです。


   
   
  1. 定義 LOG_TAG "HelloService"
  2. #が含まれ 、 "jni.h中を"
  3. #が含まれ 、 "JNIHelp.hを"
  4. #が含まれ 、 "android_runtime / AndroidRuntime.h"
  5. #が含ま <utilsの/ misc.h>
  6. #が含ま <utilsの/ LOG.H>
  7. #が含ま <ハードウェア/ hardware.h>
  8. #が含ま <ハードウェア/ hello.h>
  9. 含める <stdio.hに>

      その後hello_init、hello_getValとhello_setVal 3 JNIメソッドを定義します。


   
   
  1. 名前空間の アンドロイド
  2. {
  3. / *ハードウェア・アクセス・ハードウェア抽象化レイヤで定義された構造、リファレンス<ハードウェア/ hello.h> * /
  4. 構造体 hello_device_t * hello_device = NULL ;
  5. ハードウェア抽象化レイヤヴァル定義された値によって提供される/ *ハードウェア・アクセス・インターフェースのハードウェア・レジスタ* /
  6. 静的 ボイド hello_setVal (JNIEnvの* ENV、jオブジェクトclazz、JINT値) {
  7. int型 のval =値;
  8. LOGI("こんにちはJNI:デバイスへの設定値%D" ヴァル)。
  9. もし {(!のhello_device)
  10. LOGI("こんにちはJNI:デバイスが開いていません。");
  11. 返します
  12. }
  13. hello_device-> set_val(hello_device、ヴァル)。
  14. }
  15. / *の値によって定義されたハードウェアレジスタアクセスインターフェースハードウェアヴァルハードウェアアブストラクションレイヤを読みます* /
  16. 静的 JINT hello_getVal (JNIEnvの* ENV、jオブジェクトclazz) {
  17. int型 のval = 0 ;
  18. もし {(!のhello_device)
  19. LOGI("こんにちはJNI:デバイスが開いていません。");
  20. 返す のvalを。
  21. }
  22. hello_device-> get_val(hello_device、&val)で、
  23. LOGI("こんにちはJNI:デバイスからの値%dを取得する。"、ヴァルを)。
  24. 返す のvalを。
  25. }
  26. ハードウェアモジュールのハードウェアを開くために、オープンインタフェースを定義/ *ハードウェアアブストラクションレイヤ* /
  27. 静的 インライン int型 hello_device_open CONST hw_module_t * モジュール、構造体hello_device_t **デバイス) {
  28. リターン・ モジュール - > methods->オープン( モジュール 、HELLO_HARDWARE_MODULE_ID、(構造体 hw_device_t **)デバイス)
  29. }
  30. 指定されたハードウェア抽象化レイヤモジュールとオープン・ハードウェアをロードする/ *ハードウェアモジュールID * /
  31. 静的 jboolean hello_init (JNIEnvの* ENV、JCLASSのclazz) {
  32. hello_module_t * モジュール
  33. LOGI("こんにちはJNI:初期化......");
  34. もし (hw_get_module(HELLO_HARDWARE_MODULE_ID、( CONST 構造体 hw_module_t **)& モジュール )== 0 ){
  35. LOGI("こんにちはJNIは:こんにちはスタブが見つかりました。");
  36. もし (hello_device_open(&( モジュール - >一般的)、およびhello_device)== 0 ){
  37. LOGI("こんにちはJNIは:こんにちはデバイスがオープンしています。");
  38. リターン 0 ;
  39. }
  40. LOGE("こんにちはJNIは:こんにちは、デバイスのオープンに失敗しました。");
  41. 返す -1 ;
  42. }
  43. LOGE(「こんにちはJNIは:こんにちはスタブモジュールを取得できませんでした。」);
  44. 返す -1 ;
  45. }
  46. / * JNIメソッドテーブル* /
  47. 静的 CONSTは JNINativeMethod method_table [] = {
  48. { "init_native" "()Z" 、( ボイド *)hello_init}
  49. { "setVal_native" "(I)V" 、( ボイド *)hello_setVal}
  50. { "getVal_native" "()I" 、( ボイド *)hello_getVal}
  51. }。
  52. / * JNIメソッドを登録します* /
  53. int型 register_android_server_HelloService (JNIEnvの* ENV) {
  54. 返す jniRegisterNativeMethods(ENVを、 "COM /アンドロイド/サーバー/ HelloService" 、method_table、nelem個(method_table));
  55. }
  56. }。

      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);

      }。

      JNI_OnLoadは中register_android_server_HelloService関数呼び出しを増やします。
      extern "C" JINT JNI_OnLoadは(JavaVMの* VM、void *型に予約)
      {
       .................................................. ...............................................
       register_android_server_HelloService(ENV)。
       .................................................. ...............................................
      }
      このように、Androidシステムの初期化が自動的にJNIメソッド呼び出しテーブルをロードしますとき。
      四Android.mkは、同じディレクトリ内のファイルを変更LOCAL_SRC_FILES変数に行を追加します。
      LOCAL_SRC_FILES:= \
      com_android_server_AlarmManagerService.cpp \
      com_android_server_BatteryService.cpp \
      com_android_server_InputManager.cpp \
      com_android_server_LightsService.cpp \
      com_android_server_PowerManagerService.cpp \
      com_android_server_SystemServer.cpp \
      com_android_server_UsbService.cpp \
      com_android_server_VibratorService.cpp \
      com_android_server_location_GpsLocationProvider.cpp \
       com_android_server_HelloService.cpp /
      onload.cpp
      V.コンパイルと再発見億のsystem.img:
       USER-NAMEの@ MACHINE-NAME:〜/アンドロイド$ MMMフレームワーク/ベース/サービス/ JNI
      USER-NAMEの@ MACHINE-NAME:〜/アンドロイド$メイクsnod
       このように、system.img画像ファイルを再パッケージ化、我々はちょうど書いたJNIメソッドが含まれている、つまり、私たちは順番に、低レベルのハードウェア抽象化レイヤインタフェースを呼び出し、これらのメソッドを呼び出すためにアプリケーションフレームワーク層系のAndroid JNIにより、ハードウェアのサービスHelloServiceを提供することができますハードウェアにアクセスします。この資料の前半で述べたように、私たちが実現HelloServiceクラスを無視し、次の記事では、我々は、ハードウェア、サービスHelloServiceを実装する方法を説明しますので、ご期待ください。

おすすめ

転載: blog.csdn.net/ll148305879/article/details/93031384