Android Telegram App - > java.lang.UnsatisfiedLinkError:找不到void的实现

sta*_*all 23 java android telegram

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

我试图通过source @ 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)
Run Code Online (Sandbox Code Playgroud)

Jes*_*tro 21

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

  • 检查build.gradle包含:

源版本3.13.1和更新版本:

sourceSets.main.jniLibs.srcDirs = ['./jni/']
Run Code Online (Sandbox Code Playgroud)

源版本低于3.13.1:

    sourceSets.main {
       jniLibs.srcDirs = 'libs'
       jni.srcDirs = [] //disable automatic ndk-build call
    }
Run Code Online (Sandbox Code Playgroud)

根据您的操作系统继续操作.

Linux/Mac

$ cd <path-to-Telegram>/TMessagesProj
$ <path-to-ndk>/ndk-build
Run Code Online (Sandbox Code Playgroud)

视窗

  • 下载Cygwin
  • 添加.bashrc文件,放在Cygwin根目录下(使用一些实用程序来查找该文件).在我的情况下,文件被放入C:\cygwin64\home\myuser.

    export ndkbuild=/cygdrive/partition_name/your_ndk_directory/ndk-build.cmd
    
    Run Code Online (Sandbox Code Playgroud)
  • 打开Cygwin终端并将自己移向jni项目目录:

    cd /cygdrive/your_partition_name/project_jni_directory_path
    
    Run Code Online (Sandbox Code Playgroud)
  • 编写$ndkbuild并等待编译器完成其任务.如果此过程正确,将显示两个目录,objlibs.检查该libs目录是否包含一些带.so扩展名的库.最后,运行该项目.

  • 在mac怎么办? (2认同)

Nav*_*deh 5

正如JesúsCastro所提到的,你必须将原生代码编译成具有.so后缀的库,android可以使用它们来运行应用程序.

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

删除预构建的库.所有库的源代码都是(并且始终可用):https://github.com/DrKLO/Telegram/tree/master/TMessagesProj/jni

你可以在这里找到提交.


Fee*_*ode 2

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

android {
....
defaultConfig {
    ....
    ndk {
        abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
    }
}
Run Code Online (Sandbox Code Playgroud)

}

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