【问题标题】:Android Telegram App --> java.lang.UnsatisfiedLinkError: No implementation found for voidAndroid Telegram App --> java.lang.UnsatisfiedLinkError: No implementation found for void
【发布时间】:2016-02-19 08:32:12
【问题描述】:

不幸的是,几周前 Stackoverflow 上删除了一个类似问题,我必须提出一个新问题。

我正在尝试通过源 @https://github.com/DrKLO/Telegram 为 android 构建一个自己的 Telegram 应用程序

我无法让它工作,它在启动时停止并出现以下错误,关于从哪里开始的任何想法,我对 Android Studio 很陌生。

11-17 19:55:04.142 2667-2667/org.telegram.messenger E/art: No implementation found for void org.telegram.tgnet.ConnectionsManager.native_setJava(boolean) (tried Java_org_telegram_tgnet_ConnectionsManager_native_1setJava and Java_org_telegram_tgnet_ConnectionsManager_native_1setJava__Z)
11-17 19:55:04.142 2667-2667/org.telegram.messenger D/AndroidRuntime: Shutting down VM
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime: FATAL EXCEPTION: main
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime: Process: org.telegram.messenger, PID: 2667
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime: java.lang.UnsatisfiedLinkError: No implementation found for void org.telegram.tgnet.ConnectionsManager.native_setJava(boolean) (tried Java_org_telegram_tgnet_ConnectionsManager_native_1setJava and Java_org_telegram_tgnet_ConnectionsManager_native_1setJava__Z)
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime:     at org.telegram.tgnet.ConnectionsManager.native_setJava(Native Method)
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime:     at org.telegram.messenger.ApplicationLoader.onCreate(ApplicationLoader.java:259)
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime:     at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1013)
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime:     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4707)
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime:     at android.app.ActivityThread.-wrap1(ActivityThread.java)
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405)
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102)
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:148)
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5417)
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

【问题讨论】:

    标签: java android telegram


    【解决方案1】:

    主要问题是您在运行项目时没有从 C/C++ 代码生成本机库。由于那个基于 Telegram 的项目(您通过链接指出)在 jni 目录中有文件 Android.mk,您必须手动编译代码。我按照以下步骤修复了该异常:

    • 检查build.gradle 是否包含:

    源版本 3.13.1 及更高版本:

    sourceSets.main.jniLibs.srcDirs = ['./jni/']
    

    源版本低于 3.13.1:

        sourceSets.main {
           jniLibs.srcDirs = 'libs'
           jni.srcDirs = [] //disable automatic ndk-build call
        }
    

    根据您的操作系统继续。

    Linux / Mac

    $ cd <path-to-Telegram>/TMessagesProj
    $ <path-to-ndk>/ndk-build
    

    窗口

    • 下载Cygwin
    • 添加.bashrc 文件,该文件位于 Cygwin 根目录中(使用一些实用程序查找该文件)。在我的例子中,文件被放置在C:\cygwin64\home\myuser

      export ndkbuild=/cygdrive/partition_name/your_ndk_directory/ndk-build.cmd
      
    • 打开 Cygwin 终端,将自己移至项目的jni 目录:

      cd /cygdrive/your_partition_name/project_jni_directory_path
      
    • 写入$ndkbuild 并等待编译器完成其任务。如果这个过程是正确的,将会出现两个目录,objlibs。检查libs 目录是否包含一些带有.so 扩展名的库。最后,运行项目。

    【讨论】:

    • 谢谢!你能告诉我我们应该在哪里添加这个吗?export ndkbuild=/cygdrive/partition_name/your_ndk_directory/ndk-build.cmd
    • 好的。在 .bashrc 中的何处添加该行?
    • @Sharath 没关系,可能是最后一行。剩余内容必须相同,因此,不要更改与该行不同的任何内容。
    • 打开终端 $ cd /TMessagesProj/jni $ /ndi-build
    • 我试图在 linux 中 'cd /TMessagesProj/jni' 但它给了我 NO_SUCH_FILE 错误!然后我尝试使用 TMessangerProj 的根目录构建 ndk 它成功了!所以实际上 'cd /TMessagesProj' 是正确的答案。错误花了我大约 3 天的时间,我希望其他人不会面对它..
    【解决方案2】:

    正如 Jesús Castro 所说,您必须将本机代码编译为带有 .so 后缀的库,以便 android 可以使用它们来运行应用程序。

    但是为什么这是新发生的呢?因为在 DrKLO 的 Telegram 存储库的最后一次提交中,他们已经根据 git 中的提交消息删除了预构建的库:

    删除预建库。所有库的源代码都(并且一直)在这里:https://github.com/DrKLO/Telegram/tree/master/TMessagesProj/jni

    你可以找到提交here

    【讨论】:

      【解决方案3】:

      因此,为了解决您的问题,您可以从构建中删除 64 位库,或将 abiFilters 设置为仅打包 32 位架构:

      android {
      ....
      defaultConfig {
          ....
          ndk {
              abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
          }
      }
      

      }

      将 android.useDeprecatedNdk=true 添加到项目根目录下名为 gradle.properties 的文件中

      【讨论】:

      • 谢谢!但是我已经从构建中删除了库(被告知这样做)。任何更多的帮助将不胜感激!
      • 我认为这并不能以应有的方式解决问题。这在某种程度上逃避了使用 NDK 构建库。
      【解决方案4】:

      @Rajsundar 。如果添加行:

      export ndkbuild=/cygdrive/c/android-ndk-r10e/ndk-build.cmd
      

      不工作。完成其他所有操作后,您可以直接从 jni 目录运行命令。

      /cygdrive/c/android-ndk-r10e/ndk-build.cmd
      

      【讨论】:

        【解决方案5】:

        我收到了类似的错误消息。我的解决方案是从模拟器中卸载应用程序,清理项目(包括所有库)并进行重建。现在应用程序可以正常启动了。

        【讨论】:

        • 我每次启动应用程序时仍然报错:JNI NewGlobalRef called with pending exception java.lang.NoSuchMethodError: no non-static method "Lcom/sipo/messenger/AnimatedFileDrawableStream;.read(II)I"(强制关闭)。我哪里错了?
        • 不知道,但阅读您的错误消息表明staticnon-static 方法声明与调用之间可能存在不匹配。可能是编译出错了?
        • 哦,我发现了错误,它在proguard-rules.pro 上,其中-keep class org.telegram.** { *; }-dontwarn org.telegram.** 仍然是org.telegram
        猜你喜欢
        • 1970-01-01
        • 2016-05-07
        • 2019-01-13
        • 2019-08-25
        • 1970-01-01
        • 2014-03-02
        • 1970-01-01
        • 2021-10-28
        相关资源
        最近更新 更多