.net core+ado.net如何架构项目_新增LED设备从上层到底层理解安卓架构之JNI篇

e4fcc6425cf2c4ef9081503b931aa92d.gif

点击上方「蓝字」关注我们

d4f150a40a163993fcb6731fbd4789cd.png b4719a4f575d1b69c2a0a2def41b5c08.png 往期推荐
  • 新增LED设备--从上层到底层理解安卓架构之HAL篇

  • 新增LED设备--从上层到底层理解安卓架构之内核篇

  • 安卓系统开发之源码架构简介

      在上一篇中,我们已经完成了HAL层的开发,那么framework层要如何调用它呢?答案是JNI(Java Native Interface)。JNI简单来说就是java程序可以调用C/C++写的动态链接库。JNI的存在使得底层可以以C代码的形式实现,保持了高效率,上层又以java代码的形式实现,具备了跨平台的通用性,JNI就是二者的纽带。在这里我们要先实现一个led操作的JNI,在JNI中调用HAL层提供上来的函数接口。然后再实现一个LedService的服务,在service中调用Jni的函数接口。 c7009a23bfd4c9e877671ac187e271e2.png c304641c6dc018293cbf5a0149293433.png

JNI的实现

1.frameworks/base/services/core/jni/com_android_server_TestLedService.cpp

#define LOG_TAG "TestLedServiceJni"#include "jni.h"#include "JNIHelp.h"#include "android_runtime/AndroidRuntime.h"#include#include#include#include#includenamespace android  {      struct testled_device_t* testled_device = NULL;      static void testled_setLed1(JNIEnv* env, jobject clazz, jint value) {            int val = value;            ALOGI("TestLed JNI: set value %d to led1.", val);            if(!testled_device) {                  ALOGI("TestLed JNI: device is not open.");                  return;            }            if(val > 0){                  testled_device->control(0);//on            }else{                  testled_device->control(1);//off            }      }static void testled_setLed2(JNIEnv* env, jobject clazz, jint value) {            int val = value;            ALOGI("TestLed JNI: set value %d to led2.", val);            if(!testled_device) {                  ALOGI("TestLed JNI: device is not open.");                  return;            }            if(val > 0){                  testled_device->control(2);//on            }else{                  testled_device->control(3);//off            }      }static inline int testled_device_open(const hw_module_t* module, struct testled_device_t** device) {            return module->methods->open(module, LED_HAL_MODULE_ID, (struct hw_device_t**)device);      }static jboolean testled_init(JNIEnv* env, jclass clazz) {            testled_module_t* module;            ALOGI("TestLed JNI: initializing......");            if(hw_get_module(LED_HAL_MODULE_ID, (const struct hw_module_t**)&module) == 0) {                  ALOGI("TestLed JNI: testled Stub found.");                  if(testled_device_open(&(module->common), &testled_device) == 0) {                        ALOGI("TestLed JNI: testled device is open.");                        //testled_device->open();                        return 0;                  }                  ALOGE("TestLed JNI: failed to open testled device.");                  return -1;            }            ALOGE("TestLed JNI: failed to get testled stub module.");            return -1;      }      static const JNINativeMethod method_table[] = {            {"testledinit_native", "()Z", (void*)testled_init},            {"setled1_native", "(I)V", (void*)testled_setLed1},            {"setled2_native", "(I)V", (void*)testled_setLed2},      };      int register_android_server_TestLedService(JNIEnv *env) {            return jniRegisterNativeMethods(env, "com/android/server/TestLedService", method_table, NELEM(method_table));      }};
com_android_server_TestLedService.cpp文件实现了JNI方法testled_setLed1,testled_setLed2,还有JNI初始化的入口函数testled_init。 在testled_init内通过LED_HAL_MODULE_ID匹配到了Hal内的硬件模块,再通过testled_device_open得到了device结构体。在testled_setLed1和 testled_setLed2调用了device结构体在Hal层实现的led操作函数接口。 注意com_android_server_TestLedService文件的命令方法,com_android_server表示的是包名,表示硬件服务TestLedService在frameworks/base/services/java目录下的com/android/server目录下,此目录下的TestLedService的类是可以直接调用jni的内容的。

2.frameworks/base/services/core/jni/onload.cpp

  namespace中增加函数声明

namespace android {      ……int register_android_server_TestLedService(JNIEnv *env);};JNI_OnLoad增加register_android_server_TestLedService的函数调用extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */){      …    register_com_android_server_rkdisplay_RkDisplayModes(env);    register_android_server_TestLedService(env);return JNI_VERSION_1_4; }
这一步是Framework加载jni库,也就是在/system/lib/hw/test_led_hal.default.so被导入了。 3.frameworks/base/services/core/jni/Android.mk 在LOCAL_SRC_FILES变量中增加一行
LOCAL_SRC_FILES += \       ……    $(LOCAL_REL_DIR)/com_android_server_TestLedService.cpp \$(LOCAL_REL_DIR)/onload.cpp
4.局部编译 mmm frameworks/base/services/jni make snod 重新打包的system.img镜像文件就包含了LedTest的JNI方法了,后面我们可以通过Android系统的Framework层提供的硬件服务LedTestService来调用这些JNI方法,进而调用更低层的硬件抽象层接口去访问硬件了。Framework层的LedTestService服务在下一篇实现。 7a80b0112c2f98ab2fac840c99a4c2b2.png 05a95dcbce4776e70a8364b588faad13.png 近期,小编突然发现这里的小伙伴越来越多了,感谢大家的关注!


HAPPY

我们会继续努力把更好的嵌入式技术分享给大家。不论是在校大学生还是已经走上专业领域的技术大咖们,我们一起分享收获、共享知识、深度学习,不断攀登人工智能技术领域的高峰.


http://www.niftyadmin.cn/n/927202.html

相关文章

增加索引会锁表吗_你知道网站索引下降的原因吗?

在搜索引擎优化的过程中,我们很清楚没有索引的页面是不能参与排名的。指数建立后,指数还会继续流失,对排名也非常不利。当你的网站开始失去索引时,我们需要考虑更多,并提供恢复索引的解决方案。您的页面索引为何下降&a…

php仓储管理系统 eku_螺母ERP管理系统,支持各语言ERP系统

螺母ERP管理系统鼎立软件所有销货单选择仓库必须只能为客户成品仓、返修仓;其它仓库不得出入库,只能作为调拨、借入借出、报废、销毁仓库使用。此外,它还和应收帐、应付帐、总账等模块集成,自动产生凭证,过入总账。 螺母ERP管理系…

模块降额设计_电源模块选型比较纠结的几个问题

电源模块的出现,将嵌入式工程师从繁重的电源设计工作中解脱出来。但电源模块的种类繁多,我们在日常电路设计中该如何考虑选型呢?在日趋激烈的市场竞争中,产品的快速设计与开发无疑已经成为领先致胜、快速占领商机的必要条件。在项…

python语句正确的是-下列Python语句正确的是()_学小易找答案

【单选题】下列程序的运行结果是: c 2 ** 3 print(c) c 20 // 7 print(c) 【单选题】下列选项中,布尔值不是False的是( ) 【单选题】下列选项中,幂运算的符号是()。 【其它】如果一个 n 位正整数等于其各位数字的 n 次方之和 , 则称该数为阿姆斯特朗数,编写一个函数f(n),完成…

我的世界手机版javaui材质包_45woool传奇世界网手机版下载-45woool传奇世界手游全部版本合集...

45woool传奇世界网手机版等级:7.12020-11-10166.8MB简体中文下载推荐理由:45woool传奇世界网手机版,是一款支持三端互通的玩法的高人气传奇手游,也是一款更适合平民玩家的长期打金游戏,这款游戏中没有充值入口,所有装备全靠自己打…

android应用程序开发_抚顺小程序开发定制找谁,吉林小程序定制

湖南庚午网络科技有限公司为您详细解读kpuZae抚顺小程序开发定制找谁的相关知识与详情,微信小法式,简称小法式,缩写XCX,英文名Mini Program,是一种不需要#安拆即可使用的应用,它实现了应用“触手可及”的胡…

亚马逊出的平板电脑_亚马逊还没放弃 Fire 平板电脑系列,不过这次重要的是儿童版产品...

Kindle 和 Fire 平板都出了儿童版。北京时间 10 月 7 日晚些时候,亚马逊在 Kindle 以及 Fire 平板电脑系列下带来新款——尤其是后者的更新还是挺让人意外的,亚马逊还没放弃掉这个产品线——新款 Fire HD 10 配置的仍然是 10.1 英寸屏幕,搭载…