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/gpio.h>  #include <stdio.h>  namespace android  {  struct gpio_device_t* gpio_device = NULL;  static void gpio_setVal(JNIEnv* env, jobject clazz, jint value) {  int val = value;    gpio_device->set_val(gpio_device, val);  }     static jint gpio_getVal(JNIEnv* env, jobject clazz) {  return 0;  }      static inline int gpio_device_open(const hw_module_t* module, struct gpio_device_t** device) {  return module->methods->open(module, GPIO_HARDWARE_MODULE_ID, (struct hw_device_t**)device);  }   static jboolean gpio_init(JNIEnv* env, jclass clazz) {  gpio_module_t* module;  if(hw_get_module(GPIO_HARDWARE_MODULE_ID, (const struct hw_module_t**)&module) == 0) {  if(gpio_device_open(&(module->common), &gpio_device) == 0){  return 0;  }    return -1;      }  return -1;        }    static const JNINativeMethod method_table[] = {  {"init_native", "()Z", (void*)gpio_init},  {"setVal_native", "(I)V", (void*)gpio_setVal},  {"getVal_native", "()I", (void*)gpio_getVal},  };   int register_android_server_GpioService(JNIEnv *env) {  return jniRegisterNativeMethods(env, "com/android/server/GpioService", method_table, NELEM(method_table));  }  };  
其中GPIO_HARDWARE_MODULE_ID是在hardware/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);

修改services/jni目录下的Android.mk文件:

在LOCAL_SRC_FILES加入:

com_android_server_GpioService.cpp \
编译JNI方法:

makeTARGET_PRODUCT=am335xevm_sk-j8OMAPES=4.x

如果成功,则生成libandroid_servers.so

out/target/product/am335xevm_sk/obj/lib/libandroid_servers.so  

JNI方法编译完成后,就可以通过android硬件服务GpioService来调用JNI方法,以此来调用硬件抽象层访问底层硬件。

更多相关文章

  1. TextView支持的XML属性及相关方法
  2. 详解Android应用中使用TabHost组件进行布局的基本方法
  3. [置顶] 开发Android硬件抽象层模块接口
  4. drawRoundRect方法:绘制圆角矩形
  5. Android不同版本获取当前wifi信息方法
  6. android动态加载已安装apk中的方法
  7. Android的SQLite学习及使用方法(1)
  8. FastBoot 刷机方法

随机推荐

  1. Android HTTPS 导读
  2. Android使用自定义View继承SurfaceView实
  3. Android(安卓)Bitmap 改变的时候可能会抛
  4. Android Context完全解析,Context你用对了
  5. RadioButton样式自定义
  6. Android之分頁效果-ViewPager、Indicator
  7. Android使用OKHttp3实现下载(断点续传、
  8. 使Android开发方便快捷的8个好工具
  9. Android中Intent对象与Intent Filter过滤
  10. Android使用局和数据实现天气项目-androi