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   #include   #include   #include   #include   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方法:

make TARGET_PRODUCT=am335xevm_sk -j8 OMAPES=4.x

如果成功,则生成libandroid_servers.so

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

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

更多相关文章

  1. 【Android(安卓)初学】3、控件布局初步
  2. Android高手进阶教程(十一)之----Android(安卓)通用获取Ip的方法
  3. android ContentResolver和ContentProvider的使用
  4. Android(安卓)中LayoutInflater(布局加载器)之实战篇
  5. Android应用AsyncTask处理机制详解及源码分析
  6. QtAndroid详解(2):startActivity和它的小伙伴们
  7. android 识别U盘以及读写文件
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. Android 获得sdcard大小与内存大小工具类
  2. Android时间倒计时的简单实线
  3. android的ANR原理剖析及图解(基于android
  4. Android studio引用包冲突
  5. Android程序安装和卸载
  6. 关于Android的TimePicker和DatePicker一
  7. android之WebView的使用
  8. Android 实现开机自启动 Service
  9. Android Socket编程
  10. android 动态渐变 字符效果