Android拼音输入法的底层服务PinyinDecoderService将运行在一个独立的进程里,上层Java应用运行在另一个进程,两个进程间通信需要通过aidl文件中定义的接口调用。

如前文所述,在源码根目录下的lib/子目录中已经定义服务的接口IPinyinDecoderService。
在Java源码src/com/android/inputmethod/pinyin/PinyinDecoderService.java重载并实现一个Android服务类PinyinDecoderService:
public class PinyinDecoderService extends Service {
.....
private finalIPinyinDecoderService.Stub mBinder = new IPinyinDecoderService.Stub() {
......
};
};
PinyinDecoderService类内嵌了IPinyinDecoderService的实现并生成实例mBinder, 当外部系统调用服务的onBind()接口时,会返回这个实例,然后外部系统通过这个实例与之交互。
PinyinDecoderService的静态初始化代码会加载jni/目录下C++代码编译出来的动态链接库(so文件),此后服务PinyinDecoderService的成员函数(包括内部类实例mBinder的成员函数)基本上都是转调动态链接库的接口完成输入法的各项功能。

动态链接库可供拼音输入法服务PinyinDecoderService调用的接口都在文件jni/android/com_android_inputmethod_pinyin_PinyinDecoderService.cpp中:
1. 动态链接库加载、及注册输出函数
JNIEXPORT jint JNICALLJNI_OnLoad(JavaVM*vm, void *reserved)
static intregisterNativeMethods(JNIEnv*env, const char *className, JNINativeMethod *gMethods,int numMethods)
static intregisterNatives(JNIEnv*env)
2. 输入法功能服务函数
JNIEXPORT jint JNICALLnativeImAddLetter(JNIEnv*env, jclass clazz, jbyte ch)
JNIEXPORT jboolean JNICALLnativeImCancelInput(JNIEnv*env, jclass clazz)
JNIEXPORT jint JNICALLnativeImCancelLastChoice(JNIEnv*env, jclass clazz)
JNIEXPORT jint JNICALLnativeImChoose(JNIEnv*env, jclass clazz, jint choice_id)
JNIEXPORT jboolean JNICALLnativeImCloseDecoder(JNIEnv*env, jclass jclazz)
JNIEXPORT jint JNICALLnativeImDelSearch(JNIEnv*env, jclass jclazz, jint pos, jboolean is_pos_in_splid, jbooleanclear_fixed_this_step)
JNIEXPORT jboolean JNICALLnativeImFlushCache(JNIEnv*env, jclass clazz)
JNIEXPORT jstring JNICALLnativeImGetChoice(JNIEnv*env, jclass clazz, jint candidateId) JNIEXPORT jint JNICALLnativeImGetFixedLen(JNIEnv*env, jclass clazz)
JNIEXPORT jstring JNICALLnativeImGetPredictItem(JNIEnv*env, jclass clazz, jint predict_no) JNIEXPORT jint JNICALLnativeImGetPredictsNum(JNIEnv*env, jclass clazz, jstring fixed_str) JNIEXPORT jstring JNICALLnativeImGetPyStr(JNIEnv*env, jclass jclazz, jboolean decoded) JNIEXPORT jint JNICALLnativeImGetPyStrLen(JNIEnv*env, jclass jclazz, jboolean decoded) JNIEXPORT jintArray JNICALLnativeImGetSplStart(JNIEnv*env, jclass jclazz)
JNIEXPORT jboolean JNICALLnativeImOpenDecoder(JNIEnv*env, jclass jclazz, jbyteArray fn_sys_dict, jbyteArray fn_usr_dict)
JNIEXPORT jboolean JNICALLnativeImOpenDecoderFd(JNIEnv*env, jclass jclazz, jobject fd_sys_dict, jlong startoffset, jlong length,jbyteArray fn_usr_dict)
JNIEXPORT void JNICALLnativeImResetSearch(JNIEnv*env, jclass jclazz)
JNIEXPORT jint JNICALLnativeImSearch(JNIEnv*env, jclass jclazz, jbyteArray pybuf, jint pylen) JNIEXPORT void JNICALLnativeImSetMaxLens(JNIEnv*env, jclass jclazz, jint max_sps_len, jint max_hzs_len)
3. 输入法用户词条同步辅助函数
JNIEXPORT jboolean JNICALLnativeSyncBegin(JNIEnv*env, jclass clazz, jbyteArray dict_file) JNIEXPORT jboolean JNICALLnativeSyncClearLastGot(JNIEnv*env, jclass clazz)
JNIEXPORT jboolean JNICALLnativeSyncFinish(JNIEnv*env, jclass clazz) JNIEXPORT jint JNICALLnativeSyncGetCapacity(JNIEnv*env, jclass clazz)
JNIEXPORT jint JNICALLnativeSyncGetLastCount(JNIEnv*env, jclass clazz)
JNIEXPORT jstring JNICALLnativeSyncGetLemmas(JNIEnv*env, jclass clazz)
JNIEXPORT jint JNICALLnativeSyncGetTotalCount(JNIEnv*env, jclass clazz)
JNIEXPORT jint JNICALLnativeSyncPutLemmas(JNIEnv*env, jclass clazz, jstring tomerge)

后文将集中分析第2部分输入法功能服务函数,第1部分是所有共享库都有的,第3部分只作为输入法的辅助性功能。

转载自:http://blog.sina.com.cn/s/blog_4177a2e20100lkwi.html

更多相关文章

  1. 如何避免输入法弹出时遮挡住按钮或输入框
  2. android输入法控制显示
  3. Android App怎样调用 Frameworks Bluetooth接口
  4. Android 加载图片文件 函数
  5. Android 手动显示和隐藏软键盘 android 隐藏显示输入法键盘
  6. Android LCD(二):LCD常用接口原理篇
  7. Android中解析xml文件的接口

随机推荐

  1. Android 项目开发问题整理(持续更新)
  2. 【Android】解析Paint类中MaskFilter的使
  3. android 通话记录的查询与删除
  4. 转到编辑联系人的系统界面 编辑 添加
  5. android开发环境搭建和部署
  6. android apk 防止反编译技术第二篇-运行
  7. Android导入第三方库出现问题
  8. android 解析json数据格式
  9. android创建桌面快捷方式(启动目标非项目
  10. Android利用Http下载文件