Android 從硬體到應用:一步一步向上爬 4,android一步一步

來源:互聯網
上載者:User

Android 從硬體到應用:一步一步向上爬 4,android一步一步

Android下,java應用程式通過JNI方法調用硬體抽象層模組,在Android 從硬體到應用:一步一步向上爬 3 -- 硬體抽象層訪問硬體驅動

中我們已經編譯好了硬體抽象層模組,下面就要開始為HAL層編寫JNI方法,為上層提供服務。

cd到frameworks/base/services/jni目錄中,建立一個com_android_server_GpioService.cpp檔案:

#include "jni.h"  #include "JNIHelp.h"  #include "android_runtime/AndroidRuntime.h"  #include <utils/misc.h>  #include <utils/Log.h>  #include <hardware/hardware.h>  #include <hardware/android_gpio.h>  #include <stdio.h>  namespace android  {  struct android_gpio_device_t* android_gpio_device = NULL;  static void android_gpio_setVal(JNIEnv* env, jobject clazz, jint value) {  int val = value;    android_gpio_device->set_val(android_gpio_device, val);  }     static jint android_gpio_getVal(JNIEnv* env, jobject clazz) {  return 0;  }      static inline int android_gpio_device_open(const hw_module_t* module, struct android_gpio_device_t** device) {  return module->methods->open(module, ANDROID_GPIO_HARDWARE_MODULE_ID, (struct hw_device_t**)device);  }   static jboolean android_gpio_init(JNIEnv* env, jclass clazz) {  android_gpio_module_t* module;  if(hw_get_module(ANDROID_GPIO_HARDWARE_MODULE_ID, (const struct hw_module_t**)&module) == 0) {  if(android_gpio_device_open(&(module->common), &android_gpio_device) == 0){  return 0;  }    return -1;      }  return -1;        }    static const JNINativeMethod method_table[] = {  {"init_native", "()Z", (void*)android_gpio_init},  {"setVal_native", "(I)V", (void*)android_gpio_setVal},  {"getVal_native", "()I", (void*)android_gpio_getVal},  };   int register_android_server_GpioService(JNIEnv *env) {  return jniRegisterNativeMethods(env, "com/android/server/GpioService", method_table, NELEM(method_table));  }  };  
其中ANDROID_GPIO_HARDWARE_MODULE_ID是在hardware/android_gpio.h中定義的,初始化時通過hw_get_module方法載入硬體層模組。 修改目前的目錄下的onload.cpp:

在namespace android中加入函式宣告:

int register_android_server_GpioService(JNIEnv* env);
在JNI_Onload中加入函數調用:

register_android_server_GpioService(env);
修改frameworks/base/core/jni下的AndroidRuntime.cpp,在namespace android中加入聲明:

extern int register_android_server_GpioService(JNIEnv* env);

修改目前的目錄下的Android.mk檔案:

在LOCAL_SRC_FILES加入:

com_android_server_GpioService.cpp \
編譯JNI方法:

mmm frameworks/base/services/jni
如果提示缺少libandroid_runtime.so、libsystem_server.so、libandroid_servers.so,執行:

make libandroid_runtime

make libsystem_server
make libandroid_servers
JNI方法編譯完成後,就可以通過android硬體服務GpioService來調用JNI方法,以此來調用硬體抽象層訪問底層硬體。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.