ok6410 android driver(12)
In this essay, I will talk about how to write the service libraries.
TIPS :
I won't discuss the name rules about HAL libraries, but it's quite important to our understanding.
You can check the source file :
android_source/hardware/libhardware/hardware.c
Or google with key word :
android hardware.c
1、Android.mk
In this file, it's important to write the LOCAL_SHARED_LIBRARIES and LOCAL_C_INCLUDE to assign the libraries for the service.
# Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS) # [optional, user, eng]
# eng = required
# optinal = no install on target
LOCAL_MODULE_TAGS := eng # This is the target being built.
LOCAL_MODULE:= leds_hal_jni # Target install path.
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES) # All of the source files that we will compile.
LOCAL_SRC_FILES:= \
LedHalService.cpp # All of the shared libraries we link against.
LOCAL_SHARED_LIBRARIES := \
libandroid_runtime \
libcutils \
libhardware \
libhardware_legacy \
libnativehelper \
libsystem_server \
libutils \
libui \
libsurfaceflinger_client # Also need the JNI headers.
LOCAL_C_INCLUDES += \
$(JNI_H_INCLUDE) \
hardware/leds_hal # Don't prelink this library. For more efficient code, you may want
# to add this library to the prelink map and set this to true.
LOCAL_PRELINK_MODULE := false include $(BUILD_SHARED_LIBRARY)
2、LedHalService.cpp
Acturely, this file is the JNI file. Load the hal libraries (Use the hw_get_module function in hardware.c) and offer the API to android applications.
There are another methods array we should know is JNINativeMethod.
According the the native method, we could name the JNI functions ourselves without the long JNI default name.
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
#include <jni.h> #include <leds_hal.h> struct leds_device_t *leds_device = NULL; static jboolean leds_setOn(JNIEnv *env, jobject thiz, jint led)
{
LOGI("Leds HAL JNI : leds_setOn() is invoked."); if (leds_device == NULL) {
LOGI("Leds HAL JNI : leds_device was not fetch correctly.");
return -;
} else {
return leds_device->set_on(leds_device, led);
}
} static jboolean leds_setOff(JNIEnv *env, jobject thiz, jint led)
{
LOGI("Leds HAL JNI : leds_setOff() is invoked."); if (leds_device == NULL) {
LOGI("Leds HAL JNI : leds_device was not fetch correctly.");
return -;
} else {
return leds_device->set_off(leds_device, led);
}
} static inline int leds_device_open(const struct hw_module_t* module,
struct leds_device_t** device)
{
return module->methods->open(module, LED_HARDWARE_MODULE_ID,
(struct hw_device_t**) device);
} static jboolean leds_init(JNIEnv *env, jclass clazz)
{
leds_module_t* module; LOGI(" >> finding HAL...");
LOGI("HAL id :"LED_HARDWARE_MODULE_ID); if (hw_get_module(LED_HARDWARE_MODULE_ID,
(const hw_module_t**) &module) == ) {
LOGI("LedService JNI : Led Stub found.");
if (leds_device_open(&module->hw_module,
&leds_device) == ) {
LOGI("LedService JNI : Got Stub operation.");
return ;
}
}
LOGE("LedService JNI : Get Stub operation failed.");
return -;
} static const JNINativeMethod methods[] = {
{ "_init", "()Z", (void *) leds_init },
{ "_set_on", "(I)Z", (void *) leds_setOn },
{ "_set_off", "(I)Z", (void *) leds_setOff },
}; int register_leds_hal(JNIEnv *env)
{
static const char* const kClassName = "mobile/android/leds/hal/service/LedHalService"; jclass clazz; clazz = env->FindClass(kClassName); if (clazz == NULL) {
LOGE("Can't find class %s.\n", kClassName);
return -;
} if (env->RegisterNatives(clazz, methods,
sizeof(methods)/sizeof(methods[]) != JNI_OK)) {
LOGE("Failed registing methods for %s.\n", kClassName);
return -;
} return ;
} jint JNI_OnLoad(JavaVM *vm, void *reserved)
{
JNIEnv *env = NULL; if (vm->GetEnv((void **) &env, JNI_VERSION_1_4) != JNI_OK) {
LOGE(" GetEnv failed!");
return -;
} register_leds_hal(env); return JNI_VERSION_1_4;
}
The prototype of JNINativeMethod :
typedef struct {
const char* name;
const char* signature;
void* fnPtr;
} JNINativeMethod;
TIPS :
In the LedHalService.cpp, we use #include <leds_hal.h> instead of #include "leds_hal.h", because of the Path was loaded in the Android.mk
After compiling, we should push the file leds_jni.so to dir /system/lib/ in ok6410.
Finaly, we write the Java program to call service library.
package mobile.android.leds.hal.service;
public class LedHalService {
private static LedHalService ledHalService; public static LedHalService getInstance() {
if (ledHalService == null)
return new LedHalService();
else
return ledHalService;
} private LedHalService() {
init();
} public boolean init() {
return _init();
} public boolean setOn(int led) {
return _set_on(led);
} public boolean setOff(int led) {
return _set_off(led);
} private native boolean _init();
private native boolean _set_on(int led);
private native boolean _set_off(int led); static {
System.load("/system/lib/leds_hal_jni.so");
}
}
What's more, this is a Java file and we can't use it directly. We stiil need to create an apk to call its jar file.
package com.example.leds_haljni; import mobile.android.leds.hal.service.LedHalService;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.CheckBox; public class MainActivity extends Activity {
private CheckBox[] cBox_leds = new CheckBox[4];
LedHalService ledHalService = LedHalService.getInstance(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); cBox_leds[0] = (CheckBox) findViewById(R.id.checkBox_led1);
cBox_leds[1] = (CheckBox) findViewById(R.id.checkBox_led2);
cBox_leds[2] = (CheckBox) findViewById(R.id.checkBox_led3);
cBox_leds[3] = (CheckBox) findViewById(R.id.checkBox_led4);
} public void onClick_switch(View view) { for (int i = 0; i < 4; i ++) {
if (cBox_leds[i].isChecked()) {
ledHalService.setOn(i);
} else {
ledHalService.setOff(i);
}
}
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }
Ok, here is the activity.xml and strings.xml :
(1) activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hal_hello" /> <CheckBox
android:id="@+id/checkBox_led1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView1"
android:layout_below="@+id/textView1"
android:layout_marginTop="14dp"
android:text="@string/led1" /> <Button
android:id="@+id/button_led"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/checkBox_led4"
android:layout_alignBottom="@+id/checkBox_led4"
android:layout_alignParentRight="true"
android:onClick="onClick_switch"
android:text="@string/button_led" /> <CheckBox
android:id="@+id/checkBox_led2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/checkBox_led1"
android:layout_alignBottom="@+id/checkBox_led1"
android:layout_alignRight="@+id/textView1"
android:layout_marginRight="26dp"
android:text="@string/led2" /> <CheckBox
android:id="@+id/checkBox_led3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/checkBox_led2"
android:layout_alignBottom="@+id/checkBox_led2"
android:layout_toRightOf="@+id/checkBox_led2"
android:text="@string/led3" /> <CheckBox
android:id="@+id/checkBox_led4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/checkBox_led3"
android:layout_alignBottom="@+id/checkBox_led3"
android:layout_marginLeft="34dp"
android:layout_toRightOf="@+id/checkBox_led3"
android:text="@string/led4" /> </RelativeLayout>
(2) strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources> <string name="app_name">ledshal</string>
<string name="action_settings">Settings</string>
<string name="hal_hello">This is a leds HAL application :</string>
<string name="led1">Led1</string>
<string name="led2">Led2</string>
<string name="led3">Led3</string>
<string name="led4">Led4</string>
<string name="button_led">Switch</string> </resources>
That's all about the simple Led Hal.
ok6410 android driver(12)的更多相关文章
- ok6410 android driver(5)
Test the android driver by JNI (Java Native Interface), In the third article, we know how to compile ...
- ok6410 android driver(11)
This essay, I go to a deeply studying to android HAL device driver program. According to the android ...
- ok6410 android driver(9)
In this essay, I will write the JNI to test our leds device. If you don't know how to create a jni p ...
- ok6410 android driver(8)
In the past, we know how to create and run a simple character device driver on pc, goldfish and ok64 ...
- ok6410 android driver(3)
This article discusses the Makefile and how to port the module to different platform (localhost and ...
- ok6410 android driver(10)
From this essay, we go to a new discussion "Android Hardware Abstraction Layer". In this e ...
- ok6410 android driver(7)
This article talk about how to test device driver on JNI. There are two ways to test the device driv ...
- ok6410 android driver(6)
This is a short essay about the mistakes in compiling ok6410 android-2.3 source codes. If there is n ...
- ok6410 android driver(1)
target system : Android (OK6410) host system : Debian Wheezy AMD64 1.Set up android system in ok6410 ...
随机推荐
- Qt 实现遥感图像显示时的连动效果
遥感图像处理时少不了ENVI,用过ENVI的人都知道,打开图像时或图像处理完后,在缩略图上移动鼠标时,鼠标周围的图像信息会在大的视图中实时的显示,即大图会跟着小图中的鼠标移动,这即是图像的连动效果.如 ...
- 发布订阅 - 基于A2DFramework的事件机制实现
SUMMARY 能做什么 DEMO 原理图 应用场景 能做什么 A2DFramework的事件机制是基于发布订阅模式改进得来的一套API,中间件部分实现了msmq.redis.Supersocket可 ...
- 【C++沉思录】代理类
1.考虑下面的场景:设计一个容器,包含一组类型不同但相互关联的对象(比如:Animal,Dog,Cat),对象具备多态行为.2.容器一般只能包含一种类型的对象,使用vector<Animal&g ...
- 3D立体显示大屏幕拼接视频墙系统解决方案【转】
http://shop.souvr.com/thread-123416-1-1.html 随着3D立体视像.全息影像等技术不断取得突破性进展,国内外越来越多的公司投身3D显示领域,产品层出不穷.3D技 ...
- Material Design练习
最近写了个小应用练习material design的控件使用,使用豆瓣V2 API访问豆瓣电影,程序很小,也就用了几个API而已,能够显示北美票房榜.电影排行榜,查看电影详情,以及进行电影搜索,可惜豆 ...
- 分享一个点赞超过100的漂亮ASP.NET MVC蓝色界面框架
从 陈贞宝 博客中看到一个MVC模板感觉特别漂亮就尝试着分离出来,直接拿来用啦,直接拷贝到自己的常用的代码库里收藏起来,地址是http://www.cnblogs.com/baihmpgy/p/381 ...
- iOS开发——高级技术精选&底层开发之越狱开发第一篇
底层开发之越狱开发第一篇 做越狱开发也有一些时间了,有很多东西想总结一下,希望给他人一些借鉴,也是自己对过去开发经历的一些总结.个人不推荐使用盗版,这里主要以技术介绍为主. 这个系列里面主要介绍怎样进 ...
- checkbox与说明文字无法对齐的问题
解决方法: vertical-align:middle; 例:<input type=checkbox id="theId" name=checkbox style=&quo ...
- Windows2008 R2下,DCOM配置里的属性灰色不可用的解决方法
错误为:为应用程序池“XXXXXX”提供服务的进程在与“Windows Process Activation Service”通信时出现严重错误.该进程 ID 为"XXX".数据字 ...
- 转载 -- 如何判断Javascript对象是否存在
http://www.ruanyifeng.com/blog/2011/05/how_to_judge_the_existence_of_a_global_object_in_javascript.h ...