【问题标题】:AOSP Keyboard: NoSuchMethodError - createEmptyDictFileNativeAOSP 键盘:NoSuchMethodError - createEmptyDictFileNative
【发布时间】:2015-03-22 00:56:51
【问题描述】:

在添加一些自定义代码以获取按键触摸的压力值后,我正在尝试从 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. com.android.inputmethod.latin.define.JniLibName 不存在于我从 Google 的 repo 获得的源代码中。

像往常一样,任何帮助都将不胜感激,因为我对 Android 源代码构建非常陌生。谢谢。

问候,

伊恩

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    祝你好运 - 希望一切顺利!

    【讨论】:

    • 看来问题是从master那里拉出来的。不知道发生了什么,但在某些地方,这些类似乎被删除了。通过谷歌搜索并复制其内容,我能够像您一样找到它们。更好的方法可能是回滚到 KitKat 版本或其他东西。谢谢
    • 我刚刚检查了 Google 源的本地同步及其在其中 - 也许尝试切换到 5.0.2 分支?这就是我拉的。
    【解决方案2】:

    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
    

    如果该库不存在,则需要重新挂载 /system 并安装它。如果本地方法不存在,则需要更新的 libjni_latinime.so 共享库

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      • 1970-01-01
      • 2020-02-17
      相关资源
      最近更新 更多