标签:
android 的inputManagerService 处理外设输入。
其分为java 和c++两部分,这两部分的桥梁通过如下两个文件实现:
InputManagerService.java(framworks\base\services\core\java\com\android\server\input)
com_android_server_input_InputManagerService.cpp(framwork\base\services\core\jni)
向上承接
inputmanager.java(framworks\base\core\java\android\hardware\input)
向下承接:
inputManager.cpp(framworks\native\services\inputflinger)
那么InputManagerService.java和com_android_server_input_InputManagerService.cpp是如何互相调用呢?
java 调用c++函数,在java类中声明前加native即可:
调用时直接调用,比如nativeInit。
那么如何知道是调用c++中那种函数呢?
这个数组存储了java的函数明和c++函数的对应的关系。有些模块c++函数名是要包名加函数名的(点改成下划线)。不过这个模块c++和java函数名是相同的。
如何将这个对应关系告知系统呢?通过JNI_OnLoad()->register_android_server_inputManager()
最终通过JniRegisterNativeMethods,将java声明的native函数映射到c++函数。第二个参数就java层的类名。
接着,C++要调用java函数的关系呢?
也是register_android_server_InputManager函数实现。但是比java调用C++要复杂些。
所有需要调用的java函数都映射成jmethodID。统一放在gServiceClassInfo结构中。
以gServiceClassInfo.interceptKeyBeforQueueing为例 :
先通过JNIEnv->find_class(),找到InputManagerServer 这个java类,然后通过JniEnv->GetMethodID来讲gServiceClassInfo.interceptKeyBeforQueueing和InputMnagerServer java中的interceptKeyBeforQueueing对应。
最终调用是,通过JniEnv->CallIntMethod(), 调用InputNamangerServer java类的函数。
c++真正调用java函数时通过callXXXMethod(),XXX和返回值有关。
标签:
来源: https://blog.csdn.net/dreamfly130/article/details/82703608