Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 從硬件到應用:一步一步向上爬 4 -- 使用 JNI 方法調硬件驅動

Android 從硬件到應用:一步一步向上爬 4 -- 使用 JNI 方法調硬件驅動

編輯:關於Android編程

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   
#include   
#include   
#include   
#include   
namespace android  
{  
	struct android_gpio_device_t* android_gpio_device = NULL;  

	static void android_gpio_setVal(JNIEnv* env, jobject clazz, jint value) 
	{  
		int val = value;    
		android_gpio_device->set_val(android_gpio_device, val);  
	}  
   
	static jint android_gpio_getVal(JNIEnv* env, jobject clazz) 
	{  
		return 0;  
	}  
	    
	static inline int android_gpio_device_open(const hw_module_t* module, struct android_gpio_device_t** device) 
	{  
		return module->methods->open(module, ANDROID_GPIO_HARDWARE_MODULE_ID, (struct hw_device_t**)device);  
	}  
	 
	static jboolean android_gpio_init(JNIEnv* env, jclass clazz) 
	{  
		android_gpio_module_t* module;  
		if(hw_get_module(ANDROID_GPIO_HARDWARE_MODULE_ID, (const struct hw_module_t**)&module) == 0) 
		{  
			if(android_gpio_device_open(&(module->common), &android_gpio_device) == 0)
			{  
				return 0;  
			}    
			return -1;  
	    	}  
		return -1;        
	}  
	  
	static const JNINativeMethod method_table[] = 
	{  
		{"init_native", "()Z", (void*)android_gpio_init},  
		{"setVal_native", "(I)V", (void*)android_gpio_setVal},  
		{"getVal_native", "()I", (void*)android_gpio_getVal},  
	};  
	 
	int register_android_server_GpioService(JNIEnv *env) {  
		return jniRegisterNativeMethods(env, "com/android/server/GpioService", method_table, NELEM(method_table));  
	}  
};  
其中ANDROID_GPIO_HARDWARE_MODULE_ID是在hardware/android_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);

修改當前目錄下的Android.mk文件:

在LOCAL_SRC_FILES加入:

com_android_server_GpioService.cpp \
編譯JNI方法:

mmm frameworks/base/services/jni
如果提示缺少libandroid_runtime.so、libsystem_server.so、libandroid_servers.so,執行:

make libandroid_runtime

make libsystem_server
make libandroid_servers
JNI方法編譯完成後,就可以通過android硬件服務GpioService來調用JNI方法,以此來調用硬件抽象層訪問底層硬件。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved