android的HAL第一种调用hal方法中的JNI代码的实现:
来源:互联网 发布:暗黑启示录2java内购版 编辑:程序博客网 时间:2024/05/22 12:27
(2)JNI层
文件:mokoid-read-only/frameworks/base/service/jni/com_mokoid_server_LedService.cpp
struct led_control_device_t *sLedDevice = NULL;
static jboolean mokoid_setOn(JNIEnv* env, jobject thiz, jint led)
{
LOGI("LedService JNI: mokoid_setOn() is invoked.");
if (sLedDevice == NULL) {
LOGI("LedService JNI: sLedDevice was not fetched correctly.");
return -1;
} else {
return sLedDevice->set_on(sLedDevice, led);//调用hal层的注册的方法
}
}
static jboolean mokoid_setOff(JNIEnv* env, jobject thiz, jint led)
{
LOGI("LedService JNI: mokoid_setOff() is invoked.");
if (sLedDevice == NULL) {
LOGI("LedService JNI: sLedDevice was not fetched correctly.");
return -1;
} else {
return sLedDevice->set_off(sLedDevice, led); //调用hal层的注册的方法
}
}
/** helper APIs */
static inline int led_control_open(const struct hw_module_t* module,
struct led_control_device_t** device) {
return module->methods->open(module,LED_HARDWARE_MODULE_ID, (struct hw_device_t**)device);
//这个过程非常重要,jni通过LED_HARDWARE_MODULE_ID找到对应的stub
}
static jboolean mokoid_init(JNIEnv *env, jclass clazz)
{
led_module_t* module;
LOGI("jni init-----------------------.");
if (hw_get_module(LED_HARDWARE_MODULE_ID, (const hw_module_t**)&module) == 0) {
//根据LED_HARDWARE_MODULE_ID找到hw_module_t,参考hal层的实现
LOGI("LedService JNI: LED Stub found.");
if (led_control_open(&module->common, &sLedDevice) == 0) {
//通过hw_module_t找到led_control_device_t
LOGI("LedService JNI: Got Stub operations.");
return 0;
}
}
LOGE("LedService JNI: Get Stub operations failed.");
return -1;
}
/*
* Array of methods.
* Each entry has three fields: the name of the method, the method
* signature, and a pointer to the native implementation.
*/
static const JNINativeMethod gMethods[] = {
{ "_init", "()Z", (void *)mokoid_init },//Framework层调用_init时促发
{ "_set_on", "(I)Z", (void *)mokoid_setOn },
{ "_set_off", "(I)Z", (void *)mokoid_setOff },
};
/*
*JNINativeMethod是jni层注册的方法,Framework层可以使用这些方法
*_init 、_set_on、_set_off是在Framework中调用的方法名称,函数的类型及返回值如下:
*()Z 无参数 返回值为bool型
* (I)Z 整型参数 返回值为bool型
*/
static int registerMethods(JNIEnv* env) {
static const char* const kClassName =
"com/mokoid/server/LedService";//注意:必须和你Framework层的service类名相同
jclass clazz;
/* look up the class */
clazz = env->FindClass(kClassName);
if (clazz == NULL) {
LOGE("Can't find class %s\n", kClassName);
return -1;
}
/* register all the methods */
if (env->RegisterNatives(clazz, gMethods,
sizeof(gMethods) / sizeof(gMethods[0])) != JNI_OK)
{
LOGE("Failed registering methods for %s\n", kClassName);
return -1;
}
/* fill out the rest of the ID cache */
return 0;
}
jint JNI_OnLoad(JavaVM* vm, void* reserved) {//Framework层加载jni库时调用
JNIEnv* env = NULL;
jint result = -1;
LOGI("JNI_OnLoad LED");
if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
LOGE("ERROR: GetEnv failed\n");
goto fail;
}
assert(env != NULL);
if (registerMethods(env) != 0) { //注册你的JNINativeMethod
LOGE("ERROR: PlatformLibrary native registration failed\n");
goto fail;
}
/* success -- return valid version number */
result = JNI_VERSION_1_4;
fail:
return result;
}
文件:mokoid-read-only/frameworks/base/service/jni/com_mokoid_server_LedService.cpp
struct led_control_device_t *sLedDevice = NULL;
static jboolean mokoid_setOn(JNIEnv* env, jobject thiz, jint led)
{
LOGI("LedService JNI: mokoid_setOn() is invoked.");
if (sLedDevice == NULL) {
LOGI("LedService JNI: sLedDevice was not fetched correctly.");
return -1;
} else {
return sLedDevice->set_on(sLedDevice, led);//调用hal层的注册的方法
}
}
static jboolean mokoid_setOff(JNIEnv* env, jobject thiz, jint led)
{
LOGI("LedService JNI: mokoid_setOff() is invoked.");
if (sLedDevice == NULL) {
LOGI("LedService JNI: sLedDevice was not fetched correctly.");
return -1;
} else {
return sLedDevice->set_off(sLedDevice, led); //调用hal层的注册的方法
}
}
/** helper APIs */
static inline int led_control_open(const struct hw_module_t* module,
struct led_control_device_t** device) {
return module->methods->open(module,LED_HARDWARE_MODULE_ID, (struct hw_device_t**)device);
//这个过程非常重要,jni通过LED_HARDWARE_MODULE_ID找到对应的stub
}
static jboolean mokoid_init(JNIEnv *env, jclass clazz)
{
led_module_t* module;
LOGI("jni init-----------------------.");
if (hw_get_module(LED_HARDWARE_MODULE_ID, (const hw_module_t**)&module) == 0) {
//根据LED_HARDWARE_MODULE_ID找到hw_module_t,参考hal层的实现
LOGI("LedService JNI: LED Stub found.");
if (led_control_open(&module->common, &sLedDevice) == 0) {
//通过hw_module_t找到led_control_device_t
LOGI("LedService JNI: Got Stub operations.");
return 0;
}
}
LOGE("LedService JNI: Get Stub operations failed.");
return -1;
}
/*
* Array of methods.
* Each entry has three fields: the name of the method, the method
* signature, and a pointer to the native implementation.
*/
static const JNINativeMethod gMethods[] = {
{ "_init", "()Z", (void *)mokoid_init },//Framework层调用_init时促发
{ "_set_on", "(I)Z", (void *)mokoid_setOn },
{ "_set_off", "(I)Z", (void *)mokoid_setOff },
};
/*
*JNINativeMethod是jni层注册的方法,Framework层可以使用这些方法
*_init 、_set_on、_set_off是在Framework中调用的方法名称,函数的类型及返回值如下:
*()Z 无参数 返回值为bool型
* (I)Z 整型参数 返回值为bool型
*/
static int registerMethods(JNIEnv* env) {
static const char* const kClassName =
"com/mokoid/server/LedService";//注意:必须和你Framework层的service类名相同
jclass clazz;
/* look up the class */
clazz = env->FindClass(kClassName);
if (clazz == NULL) {
LOGE("Can't find class %s\n", kClassName);
return -1;
}
/* register all the methods */
if (env->RegisterNatives(clazz, gMethods,
sizeof(gMethods) / sizeof(gMethods[0])) != JNI_OK)
{
LOGE("Failed registering methods for %s\n", kClassName);
return -1;
}
/* fill out the rest of the ID cache */
return 0;
}
jint JNI_OnLoad(JavaVM* vm, void* reserved) {//Framework层加载jni库时调用
JNIEnv* env = NULL;
jint result = -1;
LOGI("JNI_OnLoad LED");
if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
LOGE("ERROR: GetEnv failed\n");
goto fail;
}
assert(env != NULL);
if (registerMethods(env) != 0) { //注册你的JNINativeMethod
LOGE("ERROR: PlatformLibrary native registration failed\n");
goto fail;
}
/* success -- return valid version number */
result = JNI_VERSION_1_4;
fail:
return result;
}
- android的HAL第一种调用hal方法中的JNI代码的实现:
- android的HAL第一种调用hal方法中的HAL代码的实现:
- android的HAL第一种调用hal方法中的Framework层代码的实现:
- android的HAL第一种调用hal方法中的APP层代码的实现:
- android的HAL第二种调用hal方法中的Framework层代码的实现:
- android的HAL第二种调用hal方法中的SystemServer (属于APP层)代码的实现:
- android的HAL第二种调用hal方法中的APP 测试程序(属于APP层)代码的实现:
- 一种定位android HAL代码位置的方法
- HAL中通过jni调用java方法的问题
- Android HAL实现的三种方式- 基于JNI的简单HAL设计
- Android HAL实现的三种方式(1) - 基于JNI的简单HAL设计
- Android HAL实现的三种方式(1) - 基于JNI的简单HAL设计
- Android HAL实现的三种方式(1) - 基于JNI的简单HAL设计
- Android HAL实现的三种方式(1) - 基于JNI的简单HAL设计
- Android HAL实现的三种方式(1) - 基于JNI的简单HAL设计
- Android HAL实现的三种方式(1) - 基于JNI的简单HAL设计
- Android 怎么样调用HAL的
- JNI对HAL的封装
- android的HAL第一种调用hal方法中的HAL代码的实现:
- 使用代码对magento进行reindex
- 获得txt中的记录,并取出不同的记录及个数
- only 1000 char
- 右值引用
- android的HAL第一种调用hal方法中的JNI代码的实现:
- spoj9952
- 漫谈自己理解的云计算技术
- android的HAL第一种调用hal方法中的Framework层代码的实现:
- Maven安装与配置
- android的HAL第一种调用hal方法中的APP层代码的实现:
- Linux C编程连载(7) - 变参数实现printf
- SQLite入门与分析(三)---内核概述(2)
- android的HAL第二种调用hal方法中的Framework层代码的实现: