AOSP键盘:NoSuchMethodError - createEmptyDictFileNative

时间:2015-01-23 02:46:53

标签: android keyboard android-softkeyboard android-source nosuchmethoderror

在添加一些自定义代码以获取关键触摸的压力值之后,我正在尝试从5.0.2分支构建AOSP键盘。我正在使用lunch full-eng构建源代码,并在添加更改后使用mm构建LatinIME。

我在预优化方面遇到了问题,但在这方面有助于解决that问题。我现在遇到以下错误:

E/dalvikvm(  729): ERROR: couldn't find native method
E/dalvikvm(  729): Requested: Lcom/android/inputmethod/latin/BinaryDictionary;.createEmptyDictFileNative:(Ljava/lang/String;J[Ljava/lang/String;[Ljava/lang/String;)Z
W/dalvikvm(  729): Exception Ljava/lang/NoSuchMethodError; thrown while initializing Lcom/android/inputmethod/latin/utils/JniUtils;
W/dalvikvm(  729): Exception Ljava/lang/NoSuchMethodError; thrown while initializing Lcom/android/inputmethod/latin/LatinIME;
W/dalvikvm(  729): Class init failed in newInstance call (Lcom/android/inputmethod/latin/LatinIME;)
D/AndroidRuntime(  729): Shutting down VM
W/dalvikvm(  729): threadid=1: thread exiting with uncaught exception (group=0x41f1ada0)
E/AndroidRuntime(  729): FATAL EXCEPTION: main
E/AndroidRuntime(  729): Process: com.android.inputmethod.latin, PID: 729
E/AndroidRuntime(  729): java.lang.NoSuchMethodError: no static or non-static method "Lcom/android/inputmethod/latin/BinaryDictionary;.createEmptyDictFileNative(Ljava/lang/String;J[Ljava/lang/String;[Ljava/lang/String;)Z"
E/AndroidRuntime(  729):    at java.lang.Runtime.nativeLoad(Native Method)
E/AndroidRuntime(  729):    at java.lang.Runtime.doLoad(Runtime.java:435)
E/AndroidRuntime(  729):    at java.lang.Runtime.loadLibrary(Runtime.java:363)
E/AndroidRuntime(  729):    at java.lang.System.loadLibrary(System.java:526)
E/AndroidRuntime(  729):    at com.android.inputmethod.latin.utils.JniUtils.<clinit>(JniUtils.java:28)
E/AndroidRuntime(  729):    at com.android.inputmethod.latin.LatinIME.<clinit>(LatinIME.java:513)
E/AndroidRuntime(  729):    at java.lang.Class.newInstanceImpl(Native Method)
E/AndroidRuntime(  729):    at java.lang.Class.newInstance(Class.java:1208)
E/AndroidRuntime(  729):    at android.app.ActivityThread.handleCreateService(ActivityThread.java:2723)
E/AndroidRuntime(  729):    at android.app.ActivityThread.access$1900(ActivityThread.java:169)
E/AndroidRuntime(  729):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1362)
E/AndroidRuntime(  729):    at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime(  729):    at android.os.Looper.loop(Looper.java:146)
E/AndroidRuntime(  729):    at android.app.ActivityThread.main(ActivityThread.java:5487)
E/AndroidRuntime(  729):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(  729):    at java.lang.reflect.Method.invoke(Method.java:515)
E/AndroidRuntime(  729):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
E/AndroidRuntime(  729):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
E/AndroidRuntime(  729):    at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
E/AndroidRuntime(  729):    at dalvik.system.NativeStart.main(Native Method)

LatinIME.java对此次通话有以下评论:

  

急切地加载本机库以避免意外   最初的UnsatisfiedLinkError   JNI尽可能多地打电话。

JniUtils.java拨打电话

System.loadLibrary(JniLibName.JNI_LIB_NAME);

其中JNI_LIB_NAME应在com.android.inputmethod.latin.define.JniLibName中定义。这是我认为我的问题部分存在的地方。

  1. BinaryDictionary.java不包含createEmptyDictFileNave方法
  2. 我从Google的回购邮件中获取的源代码中不存在
  3. com.android.inputmethod.latin.define.JniLibName
  4. 与往常一样,任何帮助都会非常受欢迎,因为我对Android源代码构建非常新。谢谢。

    此致

    伊恩

2 个答案:

答案 0 :(得分:0)

我刚刚在您正在使用的软件包上提取this search,发现您正在查找的类和方法确实存在,并且由于某种原因您似乎没有在本地存储库中使用它。

您是否尝试过再次同步/拉动Google源代码?您可以在同步之前git stash进行更改(您可以查看命令的详细信息及其使用情况here.

我正在进行一些系统应用修改/创建,当我使用mm构建时,我需要的所有资源都可用。

我的最后一个建议是,在您尝试自行编译LatinIME之前,先确保make full-eng平台。我必须为我的应用程序执行此操作,我相信它也适用于您的情况。

祝你好运 - 希望结果很好!

答案 1 :(得分:0)

createEmptyDictFileNative位于BinaryDictionaryUtils,JNI_LIB_NAME位于here

您可能有一个过时的libjni_latinime.so版本,它不包含为JNI导出的 createEmptyDictFileNative 函数。

拉出库并验证该方法是否存在:

adb pull /system/lib/libjni_latinime.so
nm -D libjni_latinime.so | grep createEmptyDictFile

如果库不存在,则需要重新安装/系统并安装它。如果本机方法不存在,则需要更新的libjni_latinime.so共享库