博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 从硬件到应用:一步一步向上爬 4 -- 使用 JNI 方法调硬件驱动
阅读量:5783 次
发布时间:2019-06-18

本文共 2265 字,大约阅读时间需要 7 分钟。

Android下,java应用程序通过JNI方法调用硬件抽象层模块,在

中我们已经编译好了硬件抽象层模块,以下就要開始为HAL层编写JNI方法,为上层提供服务。

cd到frameworks/base/services/jni文件夹中,新建一个com_android_server_GpioService.cpp文件:

#include "jni.h"  #include "JNIHelp.h"  #include "android_runtime/AndroidRuntime.h"  #include 
#include
#include
#include
#include
namespace android { struct gpio_device_t* gpio_device = NULL; static void gpio_setVal(JNIEnv* env, jobject clazz, jint value) { int val = value; gpio_device->set_val(gpio_device, val); } static jint gpio_getVal(JNIEnv* env, jobject clazz) { return 0; } static inline int gpio_device_open(const hw_module_t* module, struct gpio_device_t** device) { return module->methods->open(module, GPIO_HARDWARE_MODULE_ID, (struct hw_device_t**)device); } static jboolean gpio_init(JNIEnv* env, jclass clazz) { gpio_module_t* module; if(hw_get_module(GPIO_HARDWARE_MODULE_ID, (const struct hw_module_t**)&module) == 0) { if(gpio_device_open(&(module->common), &gpio_device) == 0) { return 0; } return -1; } return -1; } static const JNINativeMethod method_table[] = { {"init_native", "()Z", (void*)gpio_init}, {"setVal_native", "(I)V", (void*)gpio_setVal}, {"getVal_native", "()I", (void*)gpio_getVal}, }; int register_android_server_GpioService(JNIEnv *env) { return jniRegisterNativeMethods(env, "com/android/server/GpioService", method_table, NELEM(method_table)); } };
当中GPIO_HARDWARE_MODULE_ID是在hardware/gpio.h中定义的,初始化时通过hw_get_module方法载入硬件层模块。 改动当前文件夹下的onload.cpp:

在namespace android中增加函数声明:

int register_android_server_GpioService(JNIEnv* env);
在JNI_Onload中增加函数调用:

register_android_server_GpioService(env);
改动frameworks/base/core/jni下的AndroidRuntime.cpp,在namespace android中增加声明:

extern int register_android_server_GpioService(JNIEnv* env);

改动services/jni文件夹下的Android.mk文件:

在LOCAL_SRC_FILES增加:

com_android_server_GpioService.cpp \
编译JNI方法:

make TARGET_PRODUCT=am335xevm_sk -j8 OMAPES=4.x

假设成功,则生成libandroid_servers.so

out/target/product/am335xevm_sk/obj/lib/libandroid_servers.so

JNI方法编译完毕后,就能够通过android硬件服务GpioService来调用JNI方法,以此来调用硬件抽象层訪问底层硬件。

转载地址:http://wfvyx.baihongyu.com/

你可能感兴趣的文章
mysqlpump和mysqldump的性能大比拼(r12笔记第90天)
查看>>
中国下一个巨大的风口:物联网
查看>>
【用户状态】详细解读Oracle用户ACCOUNT_STATUS的九种状态
查看>>
Action<T>和Func<T>
查看>>
spring MVC配置详解
查看>>
SQLSERVER数据库的运维策略脚本篇
查看>>
jstl中的日期格式化
查看>>
Purcell的Emacs配置在Windows下使用
查看>>
设计模式--策略模式
查看>>
nginx之rewrite
查看>>
华为交换机基本命令配置:建立VLAN,把端口划分到对于vlan上
查看>>
存储过程SET NOCOUNT ON的作用
查看>>
A basic Particles System(1)
查看>>
如何优雅的学习正则表达式
查看>>
phpstorm笔记
查看>>
VC 在颜色索引模式下 程序不能运行
查看>>
jvm监控与调优
查看>>
我的友情链接
查看>>
Sharepoint online 无法邀请发送邮件排错一例
查看>>
Java程序员的JavaScript学习笔记 (目录)
查看>>