Android拼音输入法的底层服务PinyinDecoderService将运行在一个独立的进程里,上层Java应用运行在另一个进程,两个进程间通信需要通过aidl文件中定义的接口调用。 如前文所述,在源码根目录下的lib/子目录中已经定义服务的接口IPinyinDecoderService。 在Java源码src/com/android/inputmethod/pinyin/PinyinDecoderService.java重载并实现一个Android服务类PinyinDecoderService: public class PinyinDecoderService extends Service { ..... private final IPinyinDecoderService.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 JNICALL JNI_OnLoad (JavaVM *vm, void *reserved) static int registerNativeMethods (JNIEnv *env, const char *className, JNINativeMethod * gMethods , int numMethods) static int registerNatives (JNIEnv *env) 2. 输入法功能服务函数 JNIEXPORT jint JNICALL nativeImAddLetter (JNIEnv *env, jclass clazz, jbyte ch) JNIEXPORT jboolean JNICALL nativeImCancelInput (JNIEnv *env, jclass clazz) JNIEXPORT jint JNICALL nativeImCancelLastChoice (JNIEnv *env, jclass clazz) JNIEXPORT jint JNICALL nativeImChoose (JNIEnv *env, jclass clazz, jint choice_id) JNIEXPORT jboolean JNICALL nativeImCloseDecoder (JNIEnv *env, jclass jclazz) JNIEXPORT jint JNICALL nativeImDelSearch (JNIEnv *env, jclass jclazz, jint pos, jboolean is_pos_in_splid, jboolean clear_fixed_this_step) JNIEXPORT jboolean JNICALL nativeImFlushCache (JNIEnv *env, jclass clazz) JNIEXPORT jstring JNICALL nativeImGetChoice (JNIEnv *env, jclass clazz, jint candidateId) JNIEXPORT jint JNICALL nativeImGetFixedLen (JNIEnv *env, jclass clazz) JNIEXPORT jstring JNICALL nativeImGetPredictItem (JNIEnv *env, jclass clazz, jint predict_no) JNIEXPORT jint JNICALL nativeImGetPredictsNum (JNIEnv *env, jclass clazz, jstring fixed_str) JNIEXPORT jstring JNICALL nativeImGetPyStr (JNIEnv *env, jclass jclazz, jboolean decoded) JNIEXPORT jint JNICALL nativeImGetPyStrLen (JNIEnv *env, jclass jclazz, jboolean decoded) JNIEXPORT jintArray JNICALL nativeImGetSplStart (JNIEnv *env, jclass jclazz) JNIEXPORT jboolean JNICALL nativeImOpenDecoder (JNIEnv *env, jclass jclazz, jbyteArray fn_sys_dict, jbyteArray fn_usr_dict) JNIEXPORT jboolean JNICALL nativeImOpenDecoderFd (JNIEnv *env, jclass jclazz, jobject fd_sys_dict, jlong startoffset, jlong length, jbyteArray fn_usr_dict) JNIEXPORT void JNICALL nativeImResetSearch (JNIEnv *env, jclass jclazz) JNIEXPORT jint JNICALL nativeImSearch (JNIEnv *env, jclass jclazz, jbyteArray pybuf, jint pylen) JNIEXPORT void JNICALL nativeImSetMaxLens (JNIEnv *env, jclass jclazz, jint max_sps_len, jint max_hzs_len) 3. 输入法用户词条同步辅助函数 JNIEXPORT jboolean JNICALL nativeSyncBegin (JNIEnv *env, jclass clazz, jbyteArray dict_file) JNIEXPORT jboolean JNICALL nativeSyncClearLastGot (JNIEnv *env, jclass clazz) JNIEXPORT jboolean JNICALL nativeSyncFinish (JNIEnv *env, jclass clazz) JNIEXPORT jint JNICALL nativeSyncGetCapacity (JNIEnv *env, jclass clazz) JNIEXPORT jint JNICALL nativeSyncGetLastCount (JNIEnv *env, jclass clazz) JNIEXPORT jstring JNICALL nativeSyncGetLemmas (JNIEnv *env, jclass clazz) JNIEXPORT jint JNICALL nativeSyncGetTotalCount (JNIEnv *env, jclass clazz) JNIEXPORT jint JNICALL nativeSyncPutLemmas (JNIEnv *env, jclass clazz, jstring tomerge)
后文将集中分析第2部分输入法功能服务函数,第1部分是所有共享库都有的,第3部分只作为输入法的辅助性功能。
转载自http://blog.sina.com.cn/s/blog_4177a2e20100lkwi.html