注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
daisukeyu的个人空间 https://home.eeworld.com.cn/space-uid-410345.html [收藏] [复制] [分享] [RSS]
日志

Android HAL 开发 (2)

已有 1042 次阅读2012-8-24 10:10 |个人分类:ARM11|

在上一篇文章中,我们看到了如何撰写HAL层的用户硬件驱动程序,我们每也知道,最终该代码会被编译成动态链接库提供给service(jni)使用,那么我们下面来看看service(jni)是如何与HAL通信的。

一般service的jni代码位于framework/base/service/jni/中,我们看看mokoid的ledservice是如何实现的:

 

framework/base/service/jni/com_mokoid_server_LedService.cpp

  1. static const JNINativeMethod gMethods[] = { 
  2.     { "_init",      "()Z",  (void *)mokoid_init }, 
  3.     { "_set_on",        "(I)Z", (void *)mokoid_setOn }, 
  4.     { "_set_off",       "(I)Z", (void *)mokoid_setOff }, 
  5. }; 
  6.  
  7. int register_mokoid_server_LedService(JNIEnv* env) { 
  8.     static const charconst kClassName = 
  9.         "com/mokoid/server/LedService"
  10.     jclass clazz; 
  11.  
  12.     /* look up the class */ 
  13.     clazz = env->FindClass(kClassName); 
  14.     if (clazz == NULL) { 
  15.         LOGE("Can't find class %s\n", kClassName); 
  16.         return -1; 
  17.     } 
  18.  
  19.     /* register all the methods */ 
  20.     if (env->RegisterNatives(clazz, gMethods, 
  21.             sizeof(gMethods) / sizeof(gMethods[0])) != JNI_OK) 
  22.     { 
  23.         LOGE("Failed registering methods for %s\n", kClassName); 
  24.         return -1; 
  25.     } 
  26.  
  27.     /* fill out the rest of the ID cache */ 
  28.     return 0; 

上面的函数register_mokoid_server_LedService会把以C/C++实现的接口注册为java可调用的接口,比如mokoid_init为C/C++代码,

而_init则位java可以使用的接口。这个函数会在JNI_OnLoad里面被调用。

阅读更多下文请点击:http://www.hzlitai.com.cn/article/ARM11/SYSTEM/Android_HAL_kaifa2.html

发表评论 评论 (2 个评论)
回复 daisukeyu 2012-12-14 10:34
挺好的
回复 daisukeyu 2013-2-28 16:58
大家一起学习

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章