现在的位置: 首页 > 综合 > 正文

Android PinyinIME 源码笔记 — 1. 底层服务接口简介

2013年10月10日 ⁄ 综合 ⁄ 共 3364字 ⁄ 字号 评论关闭

 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 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, jbooleanclear_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

抱歉!评论已关闭.