Android(Java)控制GPIO的方法及耗时分析
前面两篇分别介绍了通过脚本和C代码读写/sys/class/gpio以控制GPIO。实际项目调试时经常还需要在Java代码里控制GPIO,其实现与C代码类似,唯一不同是Android权限。本文重点介绍Android6.0权限的配置并对在Java层控制GPIO的耗时做简单分析。
以高通平台为例,权限配置主要修改HLOS/device/qcom/sepolicy/common目录下的file.te、file_contexts和system_app.te三个文件。
file.te修改如下,
# GPIO accessed by system app
type sysfs_gpio, fs_type, sysfs_type;
file_contexts修改如下,
/sys/devices/soc/.pinctrl/gpio/gpio62/value u:object_r:sysfs_gpio:s0
/sys/devices/soc/.pinctrl/gpio/gpio63/value u:object_r:sysfs_gpio:s0
system_app.te修改如下,
allow system_app sysfs_gpio:file rw_file_perms;
修改完成后执行make bootimage命令,生成boot.img并使用fastboot烧录。
Android应用修改AndroidManifest.xml文件,在manifest节点中添加android:sharedUserId="android.uid.system。修改Android.mk文件,添加LOCAL_CERTIFICATE := platform设置签名。Java控制GPIO的示例代码如下,
void IOCtrl(int pin, int level) {
String path;
path = "/sys/class/gpio/gpio" + pin + "/value";
try {
FileOutputStream out = new FileOutputStream(path);
out.write(level);
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
return;
}
}
if (trigger == 0x01) {
trigger = 0x00;
IOCtrl(62, '1');
IOCtrl(63, '1');
} else {
trigger = 0x01;
IOCtrl(62, '0');
IOCtrl(63, '0');
}
以上代码执行结果如下图所示,可以看到,两个IO被拉高前后相差约2.5ms。

说明:如果只是做测试,可以使用setenforce 0命令设置SELinux为permissive模式,就可以用Android Studio编译测试应用控制GPIO,更为方便。
Android(Java)控制GPIO的方法及耗时分析的更多相关文章
- Android(Linux)控制GPIO的方法及实时性分析
Linux下控制GPIO的方法有N种,详细请参考<RPi GPIO Code Samples>,文中用十多种语言演示了如何控制GPIO,非常全面详尽.因此,这里不再多做赘述,仅把调试过程中 ...
- Android(Linux)控制GPIO方法二
前文<Android(Linux)控制GPIO的方法及实时性分析>主要使用Linux shell命令控制GPIO,该方法可在调试过程中快速确定GPIO硬件是否有问题,即对应的GPIO是否受 ...
- android jni控制gpio (rk3288)
1.添加驱动程序 2.编写jni c程序编译为库给java调用 3.app调用jni静态链接库操作底层驱动 1.添加驱动程序 修改/work/rk3288/firefly-rk3288_android ...
- java String类 trim() 方法源码分析
public String trim() { int arg0 = this.value.length; //得到此字符串的长度 int arg1 = 0; //声 ...
- RaspberryPi2B使用bcm2835c库控制GPIO
RaspberryPi2B使用bcm2835c库控制GPIO 网上有很多RaspberryPi控制GPIO的方法,有Python.WiringPi.bcm2835 C library 使用bcm283 ...
- Android Java访问本地方法(JNI)
当功能需要本地代码实现的时候,Java 代码就需要调用本地代码. 在调用本地代码时,首先要保证本地代码被加载到 Java 执行环境中并与 Java 代码连接在一起,这样 Java 代码在调用本地方法时 ...
- Android NDK开发 JNI操作java构造方法,普通方法,静态方法(七)
Android NDK开发 JNI操作java普通.静态.构造方法 1.Jni实例化一个Java类的实例jobject 1.通过FindClas( ),获取Java类的的jclass 2.通过GetM ...
- openwrt 控制gpio口的方法
利用i2c来控制gpio口 1.编译驱动或者安装驱动 # opkg update # opkg install kmod-i2c-gpio-custom kmod-i2c-core# 加载驱动 # i ...
- .NET/android/java/iOS AES通用加密解密(修正安卓)
移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,把几种语言的加密都 ...
随机推荐
- Android自定义属性
上一篇讲解了Android自定义View,这篇来讲解一下Android自定义属性的使用,让你get新技能.希望我的分享能帮助到大家. 做Android布局是件很享受的事,这得益于他良好的xml方式.使 ...
- 相克军_Oracle体系_随堂笔记002-基础
1.常见的Oracle生产库环境: 图2-1可以说是标准的生产库环境,处处体现了冗余,有效防止了单点故障.这就是HA(高可用) 而且冗在某种条件下还可以去掉,平常实现同时运行提供服务,如果一台坏掉,另 ...
- Selenium3.0 自动化测试
早在2013年的时候,Selenium官方宣布,Selenium新的版本会在圣诞节的时候发布.但是,他们并没有说哪一个圣诞节发布. 转眼的三年过去了,目前已经发布到Selenium3.0 beta4版 ...
- mongodb-基础-update-remove
1.一些操作 collection重命名: > db.post.renameCollection('foo') { "ok" : 1 } > show collecti ...
- Centos 7 开启端口
CentOS 7 默认没有使用iptables,所以通过编辑iptables的配置文件来开启80端口是不可以的 CentOS 7 采用了 firewalld 防火墙 如要查询是否开启80端口则: 1 ...
- maven全局配置文件settings.xml详解
概要 settings.xml有什么用? 如果在Eclipse中使用过Maven插件,想必会有这个经验:配置settings.xml文件的路径. settings.xml文件是干什么的,为什么要配置它 ...
- Linux iptables原理--数据包流向
Iptable与Netfilter 在上一篇文章 linux iptables常用命令--配置一个生产环境的iptables 我们知道iptables有好几个表,如raw,mangle,nat,fil ...
- 实现terminal代理
问题 作为一名Linuxer,熟练使用终端是一项必备技能,但终端中有时下载安装功能速度很慢,令人崩溃.我自然而然想到了可否加个代理,提高速度.我之前一直用shadowsocks,浏览器使用switch ...
- Error LNK1104 cannot open file 'libboost_system-vc140-mt-gd-1_58.lib'
I had a similar problem when trying to use boost unit testing in Visual Studio 2015 (Community Editi ...
- c++ const 成员函数
第一个事实: 某类中可以这么声明定义两个函数,可以重载(overload) void pa(){ cout<<"a"<<endl; } void pa() ...