为了解决 SampleIME + jvm 任务多开及 word 闪退的问题,对 动态输入法 TSF 的启动过程进行了分析。

顶层是 CSampleIME,在其构造函数中,startJVM() 启动 jvm(创建的 jvm 似乎只为了得到 penv0) 。这个过程中,对 penv0(jvm 环境), mainclass0(jar文件中的主类), dTyper0(主类的实例)进行初始化。

然后,在 CSampleIME::_AddTextProcessorEngine() 中:

 // Create composition processor engineif (_pCompositionProcessorEngine == nullptr){_pCompositionProcessorEngine = new (std::nothrow) CCompositionProcessorEngine();// set JVM_pCompositionProcessorEngine->setJvm(penv0,&mainclass0,VER,&dTyper0,startinfo);}

_pCompositionProcessorEngine 是 CSmapleIME 的一个成员指针,它又包含了 ->dTyperJar,后者是 jar 文件的调用管理接口。它还包含  ->setJvm 方法。在 ->setJvm()中,做两件事:->dTyperJar.setJvm(), ->dTyperJar.startup().

在 CSmapleIME 中启动的 jvm,其环境指针 penv0,主类 mainclass0,主类实例 dTyper0,通过  _pCompositionProcessorEngine->setJvm()传递给其成员 ->dTyperJar。

dTyperJar 是一个接口,它有 3 个重要成员:penv, mainclass, dTyper。penv 可理解为连接到宿主线程的 jvm 环境,mainclass 是 mainclass0 的本地副本,dTyper = penv->NewGlobalRef(*_dTyper0); 可理解为宿主线程上挂接的 dTyper0。

dTyperJar 还有两个重要的成员函数:setJvm() 和 startup(). 在 setJvm()中,把 penv0, mainclass0 进行本地存储,penv0->GetJavaVM(&jvm); jvm->AttachCurrentThread((void **)&penv, &args);

至此,dTyper 完成了初始化,可以执行打字功能。当需要调用 dTyper 中的函数 func_xxx() 时,

jmethodID mid1 = penv->GetMethodID(mainclass, "func_xxx", "()Ljava/lang/String;");
jstring msg1 = (jstring)penv->CallObjectMethod(dTyper, mid1);

目前看起来,penv0->GetJavaVM(&jvm); jvm->AttachCurrentThread((void **)&penv, &args); 都有可能造成 word 闪退。

动态输入法 TSF 启动过程分析相关推荐

  1. 微软输入法TSF SampleIME 代码浅说

    原文:微软输入法TSF SampleIME 代码浅说 微软提供了一个简单的TSF拼音输入法的示例SampleIME,主要的问题是:不支持数字键选候选字,不能自动上屏,没有联想功能.在笔者开发动态输入法 ...

  2. linux 重定位arm,Arm linxu启动过程分析(一)

    本文着重分析 FS2410 平台 linux-2.6.14 内核启动的详细过程,主要包括: zImage 解压缩阶段. vmlinux 启动汇编阶段. startkernel 到创建第一个进程阶段三个 ...

  3. ARM64启动过程分析

    文章目录 arm64启动过程分析 arm64启动过程分析(一)boot protocol arm64启动过程分析(二)内核启动第一步 arm64启动过程分析(三)创建启动阶段页表 arm64启动过程分 ...

  4. u-boot启动过程分析(一)

     u-boot启动过程分析(以u-boot-2012.0401为例) u-boot的启动过程可以分为以下几步 将CPU设置为管理者模式(SVC32) 关看门狗 屏蔽中断 设置时钟 设置内存控制器( ...

  5. 二、移植u-boot-2016.03到Jz2440之启动过程分析

    2.u-boot-2016.03启动过程分析     从添加Jz2440单板这一节可知,成功添加Jz2440单板后,把编译好的u-boot.bin烧写到Jz2440开发板,重新启动开发板,开发板串口没 ...

  6. 嵌入式linux启动过程分析,嵌入式Linux裸机开发(二)——S5PV210启动过程分析

    嵌入式Linux裸机开发(二)--S5PV210启动过程分析 一.iROM启动方式简介 友善之臂Smart210开发板的SoC为三星S5PV210,S5PV210采用iROM启动方式进行启动,通过查阅 ...

  7. OpenWrt启动过程分析+添加自启动脚本【转】

    一.OpenWrt启动过程分析 转自: http://www.eehello.com/?post=107 总结一下OpenWrt的启动流程:1.CFE->2.linux->3./etc/p ...

  8. pixhawk PX4FMU和PX4IO最底层启动过程分析

    摘要: pixhawk PX4FMU和PX4IO最底层启动过程分析1.1 主处理器和协处理器的固件烧写和运行流程首先,大体了解PX4IO 与PX4FMU各自的任务.PX4IO(STM32F100)为P ...

  9. ibatis动态sql配置启动时提示:The content of elements must consist of well-formed character data......

    ibatis动态sql配置启动时提示:The content of elements must consist of well-formed character data... 2012-07-18 ...

最新文章

  1. MSCKF理论推导与代码解析
  2. 地址栏射击游戏!对,你没看错,就是在地址栏上玩的游戏,有图有真相!
  3. ASP.NET Core 中间件之压缩、缓存
  4. 深入理解计算机系统之旅(一)计算机系统漫游
  5. Python IDE 详细攻略,拿来吧你~
  6. Nginx实战部署常用功能演示(超详细版),绝对给力~~~
  7. php获取网页输出,PHP 利用AJAX获取网页并输出的实现代码(Zjmainstay)_PHP教程
  8. squid服务配置(正向、反向代理)
  9. 题解:SPOJ1026 Favorite Dice
  10. 【Data Guard】Oracle DataGuard 搭建
  11. 11.17 shell特殊符号cut命令,sort_wc_uniq命令,tee_tr_split命令,shell特殊符号
  12. USB转串口,JLINK驱动安装(亲测有效)
  13. 4 curses库基垫(pad)处理
  14. IT杂谈(一):炫酷好玩网站汇总
  15. OpenGL——场景设计
  16. 【cocos】Sprite九宫格拉伸SLICED
  17. 【思考】开学第一课--大学的终结,终生学习
  18. html5侧匡下拉注释,可圈可点网资料
  19. 解析、处理 URL 的特殊参数 ,转码
  20. word分词器的使用

热门文章

  1. dedecms php_dedecms中使用php语句指南
  2. element-ui报错:Uncaught (in promise) cancel,在使用this.$confirm中报错
  3. 苹果学生购机优惠_【2019苹果教育优惠】来威锋购机瓜分500万大礼
  4. AbstractUser
  5. python爬取豆瓣书籍、电影等搜索结果,并解析html转成json格式
  6. Boosting Crowd Counting via Multifaceted Attention之人群密度估计实践
  7. 使用 Amazon Neptune 通过数据仓库构建知识图谱,借此补充商务智能体系
  8. QTP整合Sikuli
  9. springboot实现增量备份_增量同步-spring batch(6)动态参数绑定与增量同步
  10. body标签中的相关标签