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部分只作为输入法的辅助性功能。
JNIEXPORT jint JNICALL
static int
static int
JNIEXPORT jint JNICALL
JNIEXPORT jboolean JNICALL
JNIEXPORT jint JNICALL
JNIEXPORT jint JNICALL
JNIEXPORT jboolean JNICALL
JNIEXPORT jint JNICALL
JNIEXPORT jboolean JNICALL
JNIEXPORT jstring JNICALL
JNIEXPORT jstring JNICALL
JNIEXPORT jboolean JNICALL
JNIEXPORT jboolean JNICALL
JNIEXPORT void JNICALL
JNIEXPORT jint JNICALL
JNIEXPORT jboolean JNICALL
JNIEXPORT jboolean JNICALL
JNIEXPORT jint JNICALL
JNIEXPORT jstring JNICALL
JNIEXPORT jint JNICALL
JNIEXPORT jint JNICALL