美文网首页
Led控制从内核到app的实现之jni层(三)

Led控制从内核到app的实现之jni层(三)

作者: 一只好奇的茂 | 来源:发表于2017-05-24 14:20 被阅读53次

JNI概念

JNI是本地语言编程接口。它允许运行在JVM中的Java代码和用C、C++或汇编写的本地代码相互操作。
在以下几种情况下需要使用到JNI:
l 应用程序依赖于特定平台,平台独立的Java类库代码不能满足需要
l 你已经有一个其它语言写的一个库,并且这个库需要通过JNI来访问Java代码
l 需要执行速度要求的代码实现功能,比如低级的汇编代码
通过JNI编程,你可以使用本地方法来:
l 创建、访问、更新Java对象
l 调用Java方法
l 捕获及抛出异常
l 加载并获得类信息
l 执行运行时类型检查

  1. JNI_OnLoad为入口函数,代码基本可参照以下模板
jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
    JNIEnv* env = NULL;
    jint result = -1;
    if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK)
    {
        RLOGE("GetEnv failed!");
        return result;
    }
    register_led_hal_jni(env);
    return JNI_VERSION_1_4;
}

调用了register_led_hal_jni

  1. 实现register_led_hal_jni
    在"com/led/LedHalService"下寻找class类
clazz = env->FindClass(kClassName);

找到该类后注册

env->RegisterNatives(clazz, methods,sizeof(methods) / sizeof(methods[0]))
  1. 实现led_setOn,led_setOff函数
    使用led_hal_device的接口来实现
led_hal_device->set_off
led_hal_device->set_on
  1. 实现led_init 函数
    通过ID号找到mudule
**hw_get_module(LED_HARDWARE_MODULE_ID, (const hw_module_t**) &module)**

通过module->methods->open函数初始化led_hal_device

**led_control_open(&module->hw_module, &led_hal_device)**
  1. 建立Java方法与本地方法的映射
static const JNINativeMethod methods[] =
{
{ "_init", "()Z", (void *) led_init },
{ "_set_on", "(I)Z", (void *) led_setOn },
{ "_set_off", "(I)Z", (void *) led_setOff }, };

相关文章

网友评论

      本文标题:Led控制从内核到app的实现之jni层(三)

      本文链接:https://www.haomeiwen.com/subject/unmgxxtx.html