[置顶] Android(安卓)从硬件到应用:一步一步向上爬 4 -- 使用 JNI 方法调硬件驱动
16lz
2022-04-28
Android下,java应用程序通过JNI方法调用硬件抽象层模块,在Android 从硬件到应用:一步一步向上爬 3 -- 硬件抽象层访问硬件驱动
中我们已经编译好了硬件抽象层模块,下面就要开始为HAL层编写JNI方法,为上层提供服务。
cd到frameworks/base/services/jni目录中,新建一个com_android_server_GpioService.cpp文件:
#include "jni.h" #include "JNIHelp.h" #include "android_runtime/AndroidRuntime.h" #include <utils/misc.h> #include <utils/Log.h> #include <hardware/hardware.h> #include <hardware/gpio.h> #include <stdio.h> 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方法:
makeTARGET_PRODUCT=am335xevm_sk-j8OMAPES=4.x
如果成功,则生成libandroid_servers.so
out/target/product/am335xevm_sk/obj/lib/libandroid_servers.so
JNI方法编译完成后,就可以通过android硬件服务GpioService来调用JNI方法,以此来调用硬件抽象层访问底层硬件。
更多相关文章
- android开发之源码级分析(系统启动流程 & Handler消息机制 & Asyn
- 详解Android应用中使用TabHost组件进行布局的基本方法
- Android(安卓)自定义view完全解析--带你通透了解自定义view
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- Android录音并根据音量大小实现简单动画效果
- [置顶] 电源管理之android内核suspend to disk的实现(三)
- Android(安卓)fragment使用
- 浅谈Java中Collections.sort对List排序的两种方法
- Python list sort方法的具体使用