Android的电报应用程序 – > java.lang.UnsatisfiedLinkError:找不到void的实现

不幸的是一些类似的问题在几个星期前在Stackoverflow被删除,我必须提出一个新的问题。

我试图通过源@ https://github.com/DrKLO/Telegram为Android构build自己的电报应用程序

我无法得到它的工作,它停止启动时出现以下错误,任何想法,从哪里开始,我相当新的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) 

主要的问题是,你正在运行项目,而不从C / C ++代码生成本地库。 由于基于电报的项目(您通过链接指出)在jni目录上具有文件Android.mk ,因此您必须手动编译代码。 我按照以下步骤修复了这个exception:

  • 检查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 } 
  • 下载NDK

根据您的操作系统进行操作。

Linux / Mac

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

视窗

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

     export ndkbuild=/cygdrive/partition_name/your_ndk_directory/ndk-build.cmd 
  • 打开Cygwinterminal并将自己移动到项目的jni目录中:

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

正如JesúsCastro所说,你必须用.so后缀编译本地代码到库,android可以使用它们来运行应用程序。

但为什么这是新发生的? 因为在DrKLO的电报仓库的最后一次提交中,他们已经根据git中的提交信息删除了预build的库:

删除预build的库。 所有库的源代码是(并且总是)在这里可用: https : //github.com/DrKLO/Telegram/tree/master/TMessagesProj/jni

你可以在这里find提交。

因此,要解决您的问题,您可以从构build中删除64位库,或将abiFilter设置为仅打包32位体系结构:

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

}

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

@Rajsundar。 如果添加该行:

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

不pipe用。 做完所有的事情之后,你可以直接从jni目录运行命令。

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

我有一个类似的错误消息。 我的解决scheme是从模拟器卸载应用程序,清理项目(包括所有的库),并重build。 现在,应用程序启动正常。