教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 小学教育 >

Android GPIO LED 驱动与HAL分析(3)

来源:网络收集 时间:2026-08-24
导读: 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 correct

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字,全部文档内容请下载后查看。喜欢就下载吧 ……

Android GPIO LED 驱动与HAL分析(3).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/42162.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)