本文主要实现JNI层和HAL层,通过这两部分的实现来完成具体的硬件的调用过程。
一、JNI层的实现
JNI层的作用主要就是实现上层Java编写的服务层和下层C/C++编写的硬件访问层的相互调用。为了实现Java层和C/C++层之间的调用,需要实现一个C语言的函数和上文实现的Dht11Service.java这个文件当中的本地方法相对应映射,这个映射的实现具体如下:
static const JNINativeMethod methods[] = {
{"native_dht11GetDatas", "()[B", (void *)dht11GetDatas},
{"native_dht11Open", "()I", (void *)dht11Open},
{"native_dht11Close", "()V", (void *)dht11Close},
};
通过这个数组可以看出,每一个java实现的本地方法,都有一个相应的C语言实现的函数与其相对应,这样调用Java的本地方法就调用了相应的本地函数继而可以实现对硬件的访问操作,关于JNI是如何实现这一过程不是本文的重点,感兴趣的读者可以自己去查阅相关的数据和文章。
JNI层实现的这个文件的名为:com_android_server_Dht11Service.cpp,它的具体内容如下:
#define LOG_TAG "Dht11Service"
#include "jni.h"
#include "JNIHelp.h"
#include "android_runtime/AndroidRuntime.h"
#include <utils/misc.h>
#include <utils/Log.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <hardware/dht11_hal.h>
struct dht11_device_t* dht11_device;
namespace android
{
JNIEXPORT jbyteArray JNICALL dht11GetDatas(JNIEnv *, jclass);
JNIEXPORT jint JNICALL dht11Open(JNIEnv *, jclass);
JNIEXPORT void JNICALL dht11Close(JNIEnv *, jclass);
/* Define a array to implement a map for Java methods and C functions */
static const JNINativeMethod methods[] = {
{"native_dht11