Aplicación Android Telegram -> java.lang.UnsatisfiedLinkError: no se encontró implementación para el vacío

Desafortunadamente, una pregunta similar fue eliminada en Stackoverflow hace algunas semanas, debo hacer una nueva pregunta.

Estoy tratando de crear una aplicación de Telegram para Android a través de la fuente @ https://github.com/DrKLO/Telegram

No puedo hacer que funcione, se detiene al inicio con el siguiente error, cualquier idea sobre dónde empezar, soy bastante nuevo en 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) 

El principal problema es que está ejecutando el proyecto sin generar la biblioteca nativa a partir de los códigos C / C ++. Debido a ese proyecto basado en Telegram, que usted señala con el enlace, tiene el archivo Android.mk en el directorio jni , tiene que comstackr el código manualmente. Reparé esa excepción siguiendo estos pasos:

  • Compruebe que build.gradle contenga:

fuente versión 3.13.1 y más reciente:

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

Versión fuente inferior a 3.13.1:

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

Proceda según su sistema operativo.

Linux / Mac

 $ cd /TMessagesProj $ /ndk-build 

Windows

  • Descargar Cygwin
  • Agregue el archivo .bashrc , que se coloca en el directorio raíz de Cygwin (use alguna utilidad para encontrar ese archivo). En mi caso, el archivo se colocó en C:\cygwin64\home\myuser .

     export ndkbuild=/cygdrive/partition_name/your_ndk_directory/ndk-build.cmd 
  • Abra el terminal Cygwin y muévase hacia el directorio jni del proyecto:

     cd /cygdrive/your_partition_name/project_jni_directory_path 
  • Escribe $ndkbuild y espera a que el comstackdor finalice su tarea. Si este proceso es correcto, aparecerán dos directorios, obj y libs . Compruebe que el directorio libs contiene alguna biblioteca con la extensión .so . Finalmente, ejecuta el proyecto.

Como mencionó Jesús Castro, tienes que comstackr códigos nativos para las bibliotecas con el sufijo .so que Android puede usar para ejecutar la aplicación.

¿Pero por qué sucede esto recientemente? Porque en la última confirmación del repository de Telegram de DrKLO han eliminado las bibliotecas precomstackdas de acuerdo con el mensaje de confirmación en git:

Eliminando bibliotecas preconstruidas. El código fuente de todas las bibliotecas está (y siempre lo estaba) disponible aquí: https://github.com/DrKLO/Telegram/tree/master/TMessagesProj/jni

Puede encontrar el compromiso aquí .

Por lo tanto, para resolver su problema, puede eliminar sus libs de 64 bits de su comstackción, o configurar abiFilters para empaquetar solo las architectures de 32 bits:

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

}

agregue android.useDeprecatedNdk = true a un archivo llamado gradle.properties en la raíz de su proyecto

@Rajsundar. Si agrega la línea:

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

no está trabajando. Después de hacer todo lo demás, simplemente puede ejecutar el comando directamente desde el directorio jni.

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

Tuve un mensaje de error similar. La solución para mí fue desinstalar la aplicación del simulador, limpiar el proyecto (incluidas todas las bibliotecas) y hacer una reconstrucción. Ahora la aplicación comienza bien.