Android GPIO LED 驱动与HAL分析(3)
static jboolean mokoid_setOn(JNIEnv* env, jobject thiz, jint led)
{
LOGI("LedService JNI: mokoid_setOn() is invoked.");
if (sLedDevice == NULL) {
LOGI("LedService JNI: sLedDevice was not fetched
correctly.");
return -1;
} else {
return sLedDevice->set_on(sLedDevice, led);//通过set_on
函数指针,调用stub中的led_on函数
}
}
static jboolean mokoid_setOff(JNIEnv* env, jobject thiz, jint led)
{
LOGI("LedService JNI: mokoid_setOff() is invoked.");
if (sLedDevice == NULL) {
LOGI("LedService JNI: sLedDevice was not fetched
correctly.");
return -1;
} else {
return sLedDevice->set_off(sLedDevice, led); //通过set_off
函数指针,调用stub中的led_off函数
}
}
4.2.2.2 java (向下调用runtime so来调用Stub,向上暴露Java接口)
public final class LedService extends ILedService.Stub {
static {
System.load("/system/lib/libmokoid_runtime.so");//加载
runtime so文件
}
public LedService() {
Log.i("LedService", "Go to get LED Stub...");
_init();//构造函数,通过_init指针调用JNI的CPP文件中的
mokoid_init函数
}
/*
* Mokoid LED native methods.
*/
public boolean setOn(int led) {
Log.i("MokoidPlatform", "LED On");
return _set_on(led);//调用JNI层的mokiod_setOn
}
public boolean setOff(int led) {
Log.i("MokoidPlatform", "LED Off");
return _set_off(led);//调用JNI层的mokiod_setOff
}
//申明native层的接口
private static native boolean _init();
private static native boolean _set_on(int led);
private static native boolean _set_off(int led);
}
4.2.3 Core (LedManager)
本层是对上一节中的LedService另一种形式的封装。
我没有开发过Android上的Java应用程序,不知道为什么要这样做。也许是因为权限原因?非Root权限不能直接访问Service?
此层分为两部分:
ILedService.aidl 接口定义
LedManager.java 实现LedManager
4.2.3.1 ILedService.aidl
package mokoid.hardware;
//定义ILedService接口
interface ILedService
{
boolean setOn(int led);
boolean setOff(int led);
}
4.2.3.2 LedManager
/**
* Class that lets you access the Mokoid LedService.
*/
public class LedManager
{
private static final String TAG = "LedManager";
private ILedService mLedService;//申明ILedService接口的变量
public LedManager() {
mLedService = ILedService.Stub.asInterface(
ServiceManager.getService("led")); //从ServiceManage中获取一个LedService的实例
if (mLedService != null) { //获取失败
Log.i(TAG, "The LedManager object is ready.");
}
}
public boolean LedOn(int n) {
boolean result = false;
try {
result = mLedService.setOn(n); //调用Service中的setOn
} catch (RemoteException e) {
Log.e(TAG, "RemoteException in LedManager.LedOn:", e);
}
return result;
}
public boolean LedOff(int n) {
boolean result = false;
try {
result = mLedService.setOff(n); //调用Service中的setOff
} catch (RemoteException e) {
Log.e(TAG, "RemoteException in LedManager.LedOff:", e);
}
return result;
}
}
5 应用程序
本理中共有两个应用程序示例。一个是LedClient,直接调用LedService来实现控制硬件;另一个是LedTest,通过 LedManager来访问LedService实现控制硬件。
由于我没有开发过Android Java应用程序,所以不太清楚两种方式的异同。
5.1 LedClient
package com.mokoid.LedClient;
import com.mokoid.server.LedService;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class LedClient extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Call an API on the library.
LedService ls = new LedService();//建立LedService
ls.setOn(1);//操作硬件
ls.setOff(2); //操作硬件
TextView tv = new TextView(this);
tv.setText("LED 1 is on. LED 2 is off.");//显示文字
setContentView(tv);
}
}
5.2 LedTest
5.2.1 Xml
<activity android:name=".LedTest">
<intent-filter>
<action android:name="android.intent.action.MAIN"/> <category
android:name="UNCHER"/>
</intent-filter>
</activity>
<service android:name=".LedSystemServer"
android:process=".LedSystemServer" >
<intent-filter>
<action android:name="com.mokoid.systemserver"/> <category
android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</service>
从XML中可以看到申明了一个应用程序和一个名为com.mokoid.systemserver的server。
5.2.2 LedSystemServer
public class LedSystemServer extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
public void onStart(Intent intent, int startId) {
Log.i("LedSystemServer", "Start LedService...");
/* Please also see SystemServer.java for your interests. */
LedService ls = new LedService();//建立LedService
try {
ServiceManager.addService("led", ls);//向ServiceManager增加一个Service
} catch (RuntimeException e) {
Log.e(&qu …… 此处隐藏:3362字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [小学教育]四年级综合实践活动课《衣物的洗涤》教
- [小学教育]2014半年工作总结怎么写
- [小学教育]20世纪外国文学专题综合试题及答案
- [小学教育]TS_1循环使用催化丙烯环氧化反应研究
- [小学教育]最实用的考勤签到表(上下班签到表)
- [小学教育]气候与生态建筑——以新疆民居为例
- [小学教育]二人以上股东有限责任公司章程参考样本
- [小学教育]2014届第一轮复习资料4.1,3美好生活的
- [小学教育]土方开挖、降水方案
- [小学教育]手绘儿童绘本《秋天的图画》(蜡笔)
- [小学教育]2002级硕士研究生卫生统计学考试试题
- [小学教育]环保装备重点发展目录
- [小学教育]金蝶K3合并报表培训教材
- [小学教育]岩浆岩试题及参考答案
- [小学教育]知之深爱之切学习心得
- [小学教育]第十二章 蛋白质的生物合成
- [小学教育]Chapter 2-3 Solid structure and basi
- [小学教育]市政道路雨季专项施工方案
- [小学教育]中国海洋大学2012-2013学年第二学期天
- [小学教育]教育心理学第3章-学习迁移
- 浅谈深化国企改革中加强党管企业
- 2006年中国病理生理学会学术活动安排
- 设计投标工作大纲
- 基于ARP的网络攻击与防御
- 2016届湖北省七市(州)教科研协作体高三
- Google_学术搜索及其检索技巧
- 2019-2020学年七年级地理下册6.3美洲教
- 城市道路可研报告
- 【名师指津】2012高考英语 写作基础技
- 6级知识点培训北京师范大学《幼儿智趣
- 注册会计师会计知识点:金融资产
- 新安装 500 kV 变压器介损分析与判断
- PS2模拟器PCSX2设置及使用教程.
- 医院药事管理与药剂科管理组织机构
- {PPT背景素材}丹巴的醉人美景,免费,一
- NAS网络存储应用解决方案
- 青海省西宁市六年级上学期数学期末考试
- 测量管理体系手册依据ISO10012:2003
- 洞子小学培养骨干教师工作计划
- 浅谈《牛津初中英语》的教材特点及教学




