Android 从硬件到应用程序:一步一步爬上去 6 -- 我写的APP测试框架层硬件服务(终点)
创Android Applicationproject:采用Eclipse的Android插入ADT创Androidproject,project名字Gpio,创建完成后,project文件夹packages/apps/文件夹下,并删除project文件夹下的gen文件夹。不删除的话会造成类反复的错误。
src/com/android/gpio/Gpio.java:
package com.android.gpio;
import com.android.gpio.R;
import android.app.Activity;
import android.os.ServiceManager;
import android.os.Bundle;
import android.os.IGpioService;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; public class Gpio extends Activity implements OnClickListener {
private final static String LOG_TAG = "com.android.Gpio";
private IGpioService gpioService = null; private Button setButton = null;
private Button clearButton = null; /** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); gpioService = IGpioService.Stub.asInterface(
ServiceManager.getService("gpio")); setButton = (Button)findViewById(R.id.button_set);
clearButton = (Button)findViewById(R.id.button_clear); setButton.setOnClickListener(this);
clearButton.setOnClickListener(this);
} @Override
public void onClick(View v) {
if(v.equals(setButton)) {
try{
int val='1';
gpioService.setVal(val);
} catch (RemoteException e){
Log.e(LOG_TAG,"setting value");
}
}
else if(v.equals(clearButton)) {
try{
int val='0';
gpioService.setVal(val);
} catch (RemoteException e){
Log.e(LOG_TAG,"setting value");
}
}
}
}
布局res/layout/main.xml:
<? xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"> <Button
android:id="@+id/button_clear"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/clear"
android:textStyle="bold"
android:layout_marginTop="140dp"/>
<Button
android:id="@+id/button_set"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/set"
android:textStyle="bold"
android:layout_marginTop="0dp"/>
</LinearLayout>
字符串res/values/strings.xml:
<?xml version="1.0" encoding="utf-8"? >
<resources>
<string name="app_name">GPIO</string>
<string name="set">Set</string>
<string name="clear">Clear</string>
</resources>
AndroidManifest.xml:
<? xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.gpio"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name">
<activity android:name=".Gpio"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
编辑project文件夹下Android.mk:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := Gpio
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
include $(call all-makefiles-under,$(LOCAL_PATH))
编辑build/target/product/generic_no_telephony.mk:
在PRODUCT_PACKAGES := \ 后增加Gpio \
编译project会生成Gpio.apk
make TARGET_PRODUCT=am335xevm_sk -j8 OMAPES=4.x
到这一步一切准备工作都已就绪,開始更新目标板am335evm的文件系统:(左为host,右为evm)
out/target/product/am335xevm_sk/system/app/Gpio.apk ==> rootfs/ out/target/product/am335xevm_sk/system/framework/services.jar ==> rootfs/system/framework/ out/target/product/am335xevm_sk/system/framework/framework.jar ==> rootfs/system/framework/ out/target/product/am335xevm_sk/obj/lib/libandroid_servers.so ==> rootfs/system/lib/ out/target/product/am335xevm_sk/obj/lib/gpio.default.so ==> rootfs/system/lib/hw/
确保rootfs下 ueventd.rc 已经加入:(Android 从硬件到应用:一步一步向上爬 3 -- 硬件抽象层訪问硬件驱动 提到)
/dev/AdrIO 0666 root root
启动,安装Gpio.apk。打开GPIO:
现象:
点击"Set"button: D1灯亮 点击"Clear"button: D1灯灭
可见编写的APP通过调用硬件服务已经成功操作了AM335寄存器,改变AM335X_GPIO_LED4级别。经N渎MOS设备控制LED D1灯灭。
版权声明:本文博主原创文章,博客,未经同意不得转载。
Android 从硬件到应用程序:一步一步爬上去 6 -- 我写的APP测试框架层硬件服务(终点)的更多相关文章
- Android 从硬件到应用程序:一步一步爬上去 5 -- 在Frameworks蒂姆层硬件服务
Android Frameworks层提供硬件服务,Android系统APP能够调用这些硬件服务,而硬件则完全控制.实现应有的功能.上一页下一页.为了这一个frameworks高层的应用java接口硬 ...
- Android 从硬件到应用:一步一步向上爬 4 -- 使用 JNI 方法调硬件驱动
Android下,java应用程序通过JNI方法调用硬件抽象层模块,在Android 从硬件到应用:一步一步向上爬 3 -- 硬件抽象层訪问硬件驱动 中我们已经编译好了硬件抽象层模块,以下就要開始为H ...
- Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...
- 深入学习:如何实现不同Android设备之间相同应用程序的网络服务发现功能
在我们的app中添加网络服务发现功能(NSD)以方便在不同的设备上响应局域网中的请求.这种功能对于多设备之间点对点服务来说很有用,例如多人游戏,多人通话,文件共享等. 一,在网络中注册你的服务 注意: ...
- 使用GDB调试Android NDK native(C/C++)程序
使用GDB调试Android NDK native(C/C++)程序 先说明下,这里所谓的ndk native程序跟Android上层java应用没有什么关系,也不需要涉及jni来封装native接口 ...
- Android系统默认Home应用程序(Launcher)的启动过程源码分析
在前面一篇文章中,我们分析了Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还须要有一个Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home应 ...
- Android系统默认Home应用程序(Launcher)的启动过程源代码分析
在前面一篇文章中,我们分析了Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个 Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home ...
- Android应用程序框架层和系统运行库层日志系统源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6598703 在开发Android应用程序时,少 ...
- Android流媒体开发之路二:NDK开发Android端RTMP直播推流程序
NDK开发Android端RTMP直播推流程序 经过一番折腾,成功把RTMP直播推流代码,通过NDK交叉编译的方式,移植到了Android下,从而实现了Android端采集摄像头和麦克缝数据,然后进行 ...
随机推荐
- Java SE学习之数组——匿名数组和不规则数组
本文是学习网络上的文章时的总结以及自己的一点实践.感谢大家无私的分享. 近期偶然遇到了数组的问题,学习了匿名数组和不规则数组. 匿名数组适用于仅仅使用一次的情况:不规则数组适用是每行数据总数不确定的情 ...
- 科技股晴间多云 阿里京东IPO或受影响
微博的时间长达一个月的时间才上市.科技股一直笼罩. Facebook一个月股价下跌21.55%:特斯拉跌幅21.69%:亚马逊的股价相比,1一个月27日高点下跌22.13%. 以前的明星股票都已进入华 ...
- head first c<11>在根据网络编程
博文可以在一个大的网络通信实现,但是,一个人只能起到,我们能够给每个clientfork()子进程,实现诸多的服务. 方法: client连到server以后,server启动一个新创建的套接字对话. ...
- 深入浅出java并发
http://www.blogjava.net/xylz/archive/2010/07/08/325587.html
- 每天一点点java---继承exception类来实现自己的异常类
package prac_1; /** * <p>Title: 捕获异常和实现自己的异常类</p> * <p>Description: 通过继承Exception类 ...
- 博客搬到了http://xianglong.me
自己用Django建立个人博客.这个博客的部分已经迁移到新的个人博客. 博客地址:龙 (http://xianglong.me),欢迎. 版权声明:本文博客原创文章,博客,未经同意,不得转载.
- cocos2dx怎样设置ios和Android横屏竖屏的几种方法
cocos2d-x编译到ios上.默认是横屏的,若要改为http://竖屏.不同的ios版本号.方法也会不同 在ios7上或许我们设置好了横竖屏.但到了ios6上或许会变化.以下白白给大家分享一下我的 ...
- openstack 网络架构 nova-network + neutron
openstack网络架构(nova-network/neutron) openstack网络体系中,网络技术没有创新,但用到的技术点很庞杂,包含bridge.vlan.gre.vxlan.ovs.o ...
- NSIS:使用PassDialog插件实现密码安装(卸载)功能
原文 NSIS:使用PassDialog插件实现密码安装(卸载)功能 有时,出于特殊的需求,我们要给安装或卸载程序加一个密码,只有输入了正确的密码才可以继续.比如: 下面我们使用插件来实现安装密码: ...
- Android学习路线(十一)管理Activity的生命周期
当一个用户进入.退出,再次进入你的应用时,你的应用中的Activity 会在它的生命周期的各个状态下切换. 比如,当你的activity第一次启动.它出如今系统的前方接受用户的焦点.在这个过程中,An ...