zoukankan      html  css  js  c++  java
  • Android 从硬件到应用:一步一步向上爬 4 -- 使用 JNI 方法调硬件驱动

    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方法:

    make TARGET_PRODUCT=am335xevm_sk -j8 OMAPES=4.x

    假设成功,则生成libandroid_servers.so

    out/target/product/am335xevm_sk/obj/lib/libandroid_servers.so  

    JNI方法编译完毕后,就能够通过android硬件服务GpioService来调用JNI方法,以此来调用硬件抽象层訪问底层硬件。

  • 相关阅读:
    [css]浮动造成的影响
    [py]django的manytomany字段和后台搜索过滤功能
    [py][lc]python高阶函数(匿名/map/reduce/sorted)
    [py][lc]python的纸牌知识点
    [js]js中类的继承
    [js]js杂项陆续补充中...
    [js]js设计模式小结
    WP10的一点小问题
    JS 判断滚动底部并加载更多效果。。。。。。。。。
    This assembly may have been downloaded from the Web. ......
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4241479.html
Copyright © 2011-2022 走看看