Android PinyinIME 源码笔记 -- 1. 底层服务接口简介
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
更多相关文章
- 如何避免输入法弹出时遮挡住按钮或输入框
- android输入法控制显示
- Android App怎样调用 Frameworks Bluetooth接口
- Android 加载图片文件 函数
- Android 手动显示和隐藏软键盘 android 隐藏显示输入法键盘
- Android LCD(二):LCD常用接口原理篇
- Android中解析xml文件的接口