1. namespace android
2. {
3. /*在硬件抽象层中定义的硬件访问结构体,参考*/
4. struct hello_device_t* hello_device = NULL;
5. /*通过硬件抽象层定义的硬件访问接口设置硬件寄存器val的值*/
6. static void hello_setVal(JNIEnv* env, jobject clazz, jint value) {
7. int val = value;
8. LOGI(“Hello JNI: set value %d to device.”, val);
9. if(!hello_device) {
10. LOGI(“Hello JNI: device is not open.”);
11. return;
12. }
13.
14. hello_device->set_val(hello_device, val);
15. }
16. /*通过硬件抽象层定义的硬件访问接口读取硬件寄存器val的值*/
17. static jint hello_getVal(JNIEnv* env, jobject clazz) {
18. int val = 0;
19. if(!hello_device) {
20. LOGI(“Hello JNI: device is not open.”);
21. return val;
22. }
23. hello_device->get_val(hello_device, &val);
24.
25. LOGI(“Hello JNI: get value %d from device.”, val);
26.
27. return val;
28. }
29. /*通过硬件抽象层定义的硬件模块打开接口打开硬件设备*/
30. static inline int hello_device_open(const hw_module_t* module, struct hello_device_t** device) {
31. return module->methods->open(module, HELLO_HARDWARE_MODULE_ID, (struct hw_device_t**)device);
32. }
33. /*通过硬件模块ID来加载指定的硬件抽象层模块并打开硬件*/
34. static jboolean hello_init(JNIEnv* env, jclass clazz) {
35. hello_module_t* module;
36.
37. LOGI(“Hello JNI: initializing……”);
38. if(hw_get_module(HELLO_HARDWARE_MODULE_ID, (const struct hw_module_t**)&module) == 0) {
39. LOGI(“Hello JNI: hello Stub found.”);
40. if(hello_device_open(&(module->common), &hello_device) == 0) {
41. LOGI(“Hello JNI: hello device is open.”);
42. return 0;
43. }
44. LOGE(“Hello JNI: failed to open hello device.”);
45. return -1;
46. }
47. LOGE(“Hello JNI: failed to get hello stub module.”);
48. return -1;
49. }
50. /*JNI方法表*/
51. static const JNINativeMethod method_table[] = {
52. {“init_native”, “()Z”, (void*)hello_init},
53. {“setVal_native”, “(I)V”, (void*)hello_setVal},
54. {“getVal_native”, “()I”, (void*)hello_getVal},
55. };
56. /*注册JNI方法*/
57. int register_android_server_HelloService(JNIEnv *env) {
58. return jniRegisterNativeMethods(env, “com/android/server/HelloService”, method_table, NELEM(method_table));
59. }
60. }