美文网首页
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