通过android inputManagerService 看JNI 函数注册

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和返回值有关。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值