记录一下在Android 调试 LED HAL 的过程, 今天终于调通了。一个简单的LED驱动居然断断续续地调试了2个星期。
先浏览一下这个 LED HAL 的流程:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
APP (JAVA/ledclient.java)
-----------------
JAR Package (JAVA/ledservice.java -> 生成 ledservice.jar)
-----------------
----------------- JNI
LED Server (C/com_taner_ledservice.cpp -> 生成 libled_runtime.so)
-----------------
LED Stub (C/led.c -> 生成 led.goldfish.so/led.default.so)
-----------------
LED Driver (C, *.ko)
==================
Linux Kernel
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
只要了解了这个过程, 下面的开发的比较简单了。一个个文件来分析, 同时也跟大空分享一下在调试过过程中出现的问题及解决方法。
ledclient.java 为Application 的源代码,只要在 Eclipse 中新建一个 Android 工程就可以了。
在这一步可能会出现
(x) import com.taner.ledservice;
这样的错误,导致无法编译通过。其原因是因为 com.taner.ledservice.jar 这个包没有做好。
下面将介绍如何制作这个 jar 包。
第二步是制作 com.taner.ledserver.jar 这个包. 这一步试了很久才成功.
1. 假设我们这个文件的类名是 ledservice.
那么对应的目录及文件名应为: com/taner/ledserver.java
在这个文件中最开始的一行应为:
package com.taner;
...
...
public final class ledserver {
...
}
2. 有了这个原始的 java 档之后, 那么如何将她转为 jar 档案呢?
1) 新建一个 test 目录, 目录结构如下:
test
|-com
|-taner
|-ledserver.java
这个目录结构不能有错.
2) cd test
javac com/taner/ledserver.java <--生成 class 文件
jar cvf com.taner.ledserver.jar com/
之前由于没有生成 class 文件这一步,所以做出来的一直都不能用.
至此, jar 档案制作完成.
第三步制作2个SO文件。
这样上层的AP层就可以了。编译也是可以通过的。下面开始运行这个程序。
启动 Android ,按MENU可以看到 myHal 这一个图标。点击这一图标通过 LOGCAT 可以看到
trying to load lib /data/data/com.taner.ledclient/lib/libled.runtime.so
failed load lib /data/data/com.taner.ledclient/lib/libled.runtime.so
这样的信息, 很明显 load lib 出错了。
这里也犯了一个错误, 之前以为如何将 so 文件加入到 elipse中, 其实不用这么做的, 只需将这两个 so 文件放到 /data/data/com.taner/ledclient/lib 和 system/lib/hw 目录下就可以了.
在开发的过程中还有两个问题要注意的:
1. 在放两个 *.so 文件时有可能会出现一些错误,
1)如使用 adb push 时提示 the filesystem is readonly.
解决方法: adb remount
2)还有可能会出现 out of memory, 这样就需配置一下模拟器的 memory size 了
解决方法: emulator -avd AVD_2_2 -partition-size 256
2. 在做最后一个库 libled.runtime.so 时, 需要注意这个库的名称, 这个库的名称是与 led.h 中的 LED_HARDWARE_MODULE_ID 一致的. 不然会提示找不到这个 lib.
之前觉得 #define LED_HARDWARE_MODULE_ID "led" 这个不太好, 后来改为 "led test", 呵呵, 这样就出问题了, 提示找不到 libled.runtime.so.
3. 还有一个问题也挺奇怪的, 就是在 led.c (stub) 中调用 system() 或 open() 函数居然不成功, 这是标准的C函数啊. 后来上网查了一下, 要 chmod 777 filename 才行, chmod 666 都不可以, 不知道为什么, 但是 system() 还是无法使用.
阅读(1496) | 评论(2) | 转发(0) |