Android APP如何简单快速实现控制硬件设备

  • driver(C)层
    • 硬件控制
    • 节点的创建
  • APP(java)层
  • native(C/C++)层
  • 接下来上干货,重点说说实现流程
    • Android studio 中APP 实现部分
    • 驱动实现部分
    • 安装APP调试
    • APP签名

本文叙述的是方便快速的实现APP控制硬件,而不是Android的整体架构。Android APP控制硬件设备主要是通过JNI工具,实现Java层与C层的链接。driver层实现对硬件的直接控制,并通过创建文件或设备节点提供给native层访问。在native层代码中实现Java调用接口,一般包括对文件节点的open、read、write等操作,并利用ndk工具将native层代码编译成.so库,提供给Java层调用。

driver©层

在驱动层包括两方面的任务。第一是实现硬件控制部分,第二是实现节点创建。

硬件控制

主要通过对硬件模块寄存器的读写操作,或者对GPIO的置位和复位。
例如,你想控制开发板的某个led,那么只需要对那个led对应的寄存器的某一位置位(设置1)或复位(设置0)即可。
如果想要控制某个模块设备的led,就需要通过通信协议实现,通信协议一般包括II2,SPI,UART等等。

节点的创建

在Android/Linux驱动中创建节点的方法有三种。第一,通过fileoperation结构体创建
第二,通过sys文件系统创建
第三,通过proc文件系统创建

APP(java)层

下面展示一些 内联代码片,主要实现Java层的调用接口,文件名:

myjni.java

package com.example.awdetectapplication;public class awjni {//本方法主要实现了驱动节点的读写操作public static native int IICWriteRead(byte[] WriteBuffer, int WriteLength,byte[] ReadBuffer, int ReadLength);//本方法主要实现了驱动节点的打开和关闭public static native int OpenDeviceNode();public static native int CloseDeviceNode();static {//jni为生成.so库的名字System.loadLibrary("jni");}
}

native(C/C++)层

在本层通过C语言实现对节点的读写。

下面展示一些 内联代码片,文件名:
myjni.c

/** Class:     com_example_awdetectapplication_awjni* Method:    IICWriteRead* Signature: ([BI[BI)I*/#include <errno.h>#include <fcntl.h>#include <malloc.h>#include <math.h>#include <stdbool.h>#include <stdio.h>#include <string.h>#include <unistd.h>#include <jni.h>#include <android/log.h>#define LOG_TAG "hello"#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)#define DEVICE_NAME    "/dev/hello"static int fd = 0;int file_read(jbyte *rbuf, jint rlen)
{int ret;fd = open(DEVICE_NAME,O_RDWR|O_NONBLOCK);if (fd < 0) {LOGE("jni open fail for read, fd = %d\n",fd);}LOGE("jni open sueeessed for read, fd = %d\n",fd);LOGE("jni read rlen=%d, bufr = %#x\n", rlen, rbuf[0]);ret = read(fd, rbuf, rlen);if (ret < 0) {LOGE("jni read fail ret = %d\n",ret);return ret;}LOGE("jni read successed ret = %d\n",ret);close(fd);return ret;
}int file_write(jbyte *wbuf, jint wlen)
{int ret;fd = open(DEVICE_NAME,O_RDWR|O_NONBLOCK);if (fd < 0) {LOGE("jni open device fail, fd = %d\n",fd);return -errno;}LOGE("jni write bufw=%#x\n", wbuf[0]);LOGE("jni write wlen=%d\n", wlen);ret = write(fd, wbuf, wlen);if (ret < 0) {LOGE("jni write fail, ret = %d\n", ret);ret = -errno;} else if (ret != wlen) {LOGE("jni write fail,ret = %d,wlen = %d\n",ret,wlen);ret = -EAGAIN;} else {LOGE("jni write successed ret = %d\n",ret);}close(fd);return ret;
}JNIEXPORT jint JNICALL Java_com_example_awdetectapplication_awjni_IICWriteRead(JNIEnv *env, jclass class, jbyteArray wbuf, jint Wlen, jbyteArray rbuf, jint Rlen){int ret = 0;jbyte* bufw = (*env)->GetByteArrayElements(env,wbuf,NULL);jbyte* bufr = (*env)->GetByteArrayElements(env,rbuf,NULL);jint wlen = (*env)->GetArrayLength(env,wbuf);jint rlen = (*env)->GetArrayLength(env,rbuf);LOGE("jni first wlen=%d, rlen = %d\n", wlen,rlen);if(wlen > 1) {file_write(bufw, wlen);}//get reg addrbufr[0] = bufw[0];if (rlen > 0) {file_read(bufr, rlen);}return ret;}/** Class:     com_example_awdetectapplication_awjni* Method:    OpenDeviceNode* Signature: ()*/
JNIEXPORT jint JNICALL Java_com_example_awdetectapplication_awjni_OpenDeviceNode(JNIEnv *env, jclass class){fd = open(DEVICE_NAME,O_RDWR|O_NONBLOCK);if (fd < 0) {LOGE("jni open fail, fd = %d\n",fd);}LOGE("jni open sueeessed, fd = %d\n",fd);return fd;}/** Class:     com_example_awdetectapplication_awjni* Method:    CloseDeviceNode* Signature: ()I*/
JNIEXPORT jint JNICALL Java_com_example_awdetectapplication_awjni_CloseDeviceNode(JNIEnv *env, jclass class){close(fd);return 0;}

接下来上干货,重点说说实现流程

Android studio 中APP 实现部分

1.创建刚刚上边提到的myjni.java代码,简单的说,就是你的Java程序的最底层调用接口;

2.通过java命令生成 .h文件。这个 .h文件就是你要实现的native层代码,你必须,原封不动的对这个 .h进行CV(复制粘贴)操作,创建myjni.c文件,在该文件中实现对应的接口;

3.javah命令,是JDK中带的一个功能,主要是通过它来创建 .h文件。具体命令如下:
①进入app/src/main/java

②运行javah -jni com. exampole.myapplication.myjni(注意,这里就是之前创建的myjni.java文件的路径)

③没有错误,Java路径下会生成一个.h文件;

④在main/java/创建JN目录;

⑤在JNI目录下根据.h文件,实现对应的myjni.c,即之前的文件;

⑥在JNI目录下,实现Android.mk,具体实现如下:
Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := jni //jni 即是最终生成的库名字
LOCAL_SRC_FILES := myjni.c //即是.c源文件
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)

⑦通过终端进入到JNI路径,进行编译:
运行 ndk-build,编译成功后,会在Java目录下生成libs目录;
关于ndk,若没有安装,在使用之前必须先安装,ndk的功能即编译工具,将.c文件编译成.so文件。

⑧在main/路径下创建jniLib目录,将将libs目录下的库全部复制到jniLib下;
好了终于,大功告成,接下来进行编译APP,直接点击Android Studio的编译按钮,编译成功即可;

驱动实现部分

还有最关键一步,千万不要忘记,加载驱动,千万,千万,不然将会找不到文件节点;

①编译linux内核,将驱动编译进image;

②重新烧写系统镜像,抓取内核的log,等到驱动加载成功后,会在/dev下或者sys/bus/i2c/driver 路径下出现对应的驱动文件节点。

安装APP调试

对于与你开发的APP,如果要安装到手机上,有两种方式:

第一、打开手机调试模式,直接通过USB连接手机,利用Android studio进行调试;

第二 、对你的APP进行签名,然后安装。

APP签名

第一步,如图所示,依次点击:

第二步,选择APK,点击NEXT


第三步,开始注册签名,如果有签名key,则直接选择,没有的话点击Create new:

开始输入签名信息:first and last name之前的项目是必填项:


点击ok后会弹出一个警告窗口,直接点击ok即可。然后回到下边界面:

第四步,点击next,选择发行版本,并勾选下边的V1,V2,V1是必须勾选的,用以生成签名文件,V2只有在APP上架应用商店时才选择,完了后点击finish。

第五步,点击如下Build,再次利用已经生成的签名文件编译APP即可。

结束后,在APP工程路径下的D:\Android_work\xxxx\app\build\outputs\apk\debug目录下会生成对应的APK文件,可以直接传到手机端安装使用

Android APP的签名介绍到此结束。

Android APP如何简单快速实现控制硬件设备并实现APP签名相关推荐

  1. stm8/stm32如何通过ESP8266连接天猫精灵和小爱同学,实现(AT指令)语音助手控制硬件设备

    stm8/stm32如何通过ESP8266连接天猫精灵和小爱同学,实现(AT指令)语音助手控制硬件设备 博主还是菜鸟,只是这段时间DIY弄了这些东西,让同样喜欢动手的朋友有个参考,我这个开发超级简单, ...

  2. 通过文件IO控制硬件设备的方法

    文章目录 1 通过文件IO控制硬件设备的方法 1.1 原理介绍 1.2 LED灯程序 1 通过文件IO控制硬件设备的方法 1.1 原理介绍 驱动程序: 本质:是硬件设备创建相应的设备节点文件.创建设备 ...

  3. 微信硬件平台结合机智云,实现微信控制硬件设备

    随着微信公众号及微信小程序的崛起,手机app的缺点开始凸显出来,尤其像一些功能不多,画面也不用很绚的app,完全是可以用微信公众号或者小程序替代的.因此公司也打算往微信公众号这块发展,此篇文章将实现一 ...

  4. 软件测试web和app,软件测试如何快速进阶?过来人科普Web与App测试5大区别!

    随着各种移动设备的更新换代,移动互联网呈飞速发展状态,同时,移动应用更是呈指数增长.因为这种情况, app测试方面需求也随之大涨,已经逐渐赶超web测试.我 做了快三年的测试了 , 大部分时间都在做 ...

  5. mac app图标简单制作_如何在Mac中更改App图标

    mac app图标简单制作 Sometimes, apps icon change but we like the older icon. Thankfully, it's very easy to ...

  6. 万能监控摄像头app软件下载_黄岩安科瑞环保设备用电监控app下载

    黄岩安科瑞环保设备用电监控app下载 在满足电力需求.施工快速方便.防腐易行.使用成本低廉的情况下,建筑电源是必须的,并且还有很强的应用价值.(安全环保系统)一.总体优势方便:不同的建筑电源要求安装在 ...

  7. Android开发之简单快速对APP进行GIF动图生成

    前提: 1.在对APP进行GIF动图生成之前,需要配置ADB(Android Debug Bridge),具体百度,在这里就不做赘述了. 2.准备一个播放器,迅雷.暴风.QQ之类的.将adb命令录制的 ...

  8. Android开发——跳转到应用商店以及app详情页、获取手机硬件信息、验证app是否存在

    普通跳转 Tip:该跳转可适配普通的跳转,比如跳转豌豆荚 //appPkg是你要跳转的包名//marketPkg是你使用的应用商店,如果传空,则会把你手机上的应用商店全部列出来try {if (Tex ...

  9. Android 友盟简单快速集成

    1,打开友盟官网,进行注册,添加 app ,记住 key. 2,集成,一共两种方式,使用 jar 包和 自动集成,这里我们选择自动集成,如下: ​ 在项目的 gradle 中添加如下: reposit ...

最新文章

  1. java运行时_java编译时与运行时概念与实例详解
  2. Centos7上yum安装mongodb4-2
  3. 【安全漏洞】ProxyShell利用分析2——CVE-2021-34523
  4. springboot-springmvc请求参数获取与原理【长文预警,收藏慢啃】
  5. 详解python的super()的作用和原理
  6. Spring的配置文件详解
  7. 关于JDBC的一些笔记
  8. 关键词热度分析工具_阿里国际站外贸独立站关键词的收集
  9. 织梦内核素材资源下载站源码-带用户中心和VIP充值系统+安装视频图文教程
  10. 微信回应「10 元就能在朋友圈改定位」;谷歌官方首次提及 Android 11;Node 8.16.2 发布 | 极客头条...
  11. Java里的阻塞队列
  12. mysql 插入慢_记一次生产环境mysql数据库参数优化,值得收藏
  13. Android UI组件----ListView列表控件详解
  14. Android UI学习之Gallery
  15. 除了iframe嵌套还有什么嵌套_嵌套了ROUND函数,为什么还会差1分钱,值得收藏
  16. 2022年来啦!丨新年回馈粉丝丨免费抽奖!
  17. Python入门学习二:列表
  18. mysql中常用的筛查语句,使用SQL语句进行数据筛选的方法
  19. DY(抖音)、KS(快手)、西瓜、知乎等批量去水印小程序版本可视化版本
  20. RLC振荡原理与RC Snubber吸收电路

热门文章

  1. 计算机械结构变形,机械结构设计-力学原理设计准则
  2. 智慧工地管理平台系统赋能建筑工地绿色施工
  3. addEventListener和addListener的区别
  4. 最强大易用的开源MODBUS库-YMODBUS,包含MASTER/SLAVE
  5. chai.js------使用
  6. 【Flutter】【path_provider】path_provider文件系统
  7. QOS概述(四)拥塞管理和拥塞避免
  8. 【学习笔记】Splay
  9. 2022年河北省高职单招(综合素质)考试冲刺试题及答案
  10. vm-tools 安装