web-dev-qa-db-fra.com

Impossible de charger la bibliothèque: reloc_library [1285]: impossible de localiser 'Rand'

J'essaie d'utiliser la bibliothèque PJSIP pour mon Android. J'ai construit un exemple d'application pjsua conformément à ce manuel: https://trac.pjsip.org/repos/wiki/ Mise en route/Android

Mais lorsque l'exemple d'application se lance, des exceptions se déclenchent:

12-06 15:03:58.043: D/dalvikvm(628): Trying to load lib /data/data/org.pjsip.pjsua2.app/lib/libpjsua2.so 0x4129d980
12-06 15:03:58.064: W/dalvikvm(628): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lorg/pjsip/pjsua2/app/MyApp;
12-06 15:03:58.064: D/AndroidRuntime(628): Shutting down VM
12-06 15:03:58.064: W/dalvikvm(628): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
12-06 15:03:58.083: E/AndroidRuntime(628): FATAL EXCEPTION: main
12-06 15:03:58.083: E/AndroidRuntime(628): Java.lang.ExceptionInInitializerError
12-06 15:03:58.083: E/AndroidRuntime(628):  at org.pjsip.pjsua2.app.MainActivity.onCreate(MainActivity.Java:85)
12-06 15:03:58.083: E/AndroidRuntime(628):  at Android.app.Activity.performCreate(Activity.Java:4465)
12-06 15:03:58.083: E/AndroidRuntime(628):  at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1049)
12-06 15:03:58.083: E/AndroidRuntime(628):  at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1920)
12-06 15:03:58.083: E/AndroidRuntime(628):  at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:1981)
12-06 15:03:58.083: E/AndroidRuntime(628):  at Android.app.ActivityThread.access$600(ActivityThread.Java:123)
12-06 15:03:58.083: E/AndroidRuntime(628):  at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1147)
12-06 15:03:58.083: E/AndroidRuntime(628):  at Android.os.Handler.dispatchMessage(Handler.Java:99)
12-06 15:03:58.083: E/AndroidRuntime(628):  at Android.os.Looper.loop(Looper.Java:137)
12-06 15:03:58.083: E/AndroidRuntime(628):  at Android.app.ActivityThread.main(ActivityThread.Java:4424)
12-06 15:03:58.083: E/AndroidRuntime(628):  at Java.lang.reflect.Method.invokeNative(Native Method)
12-06 15:03:58.083: E/AndroidRuntime(628):  at Java.lang.reflect.Method.invoke(Method.Java:511)
12-06 15:03:58.083: E/AndroidRuntime(628):  at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:784)
12-06 15:03:58.083: E/AndroidRuntime(628):  at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:551)
12-06 15:03:58.083: E/AndroidRuntime(628):  at dalvik.system.NativeStart.main(Native Method)
12-06 15:03:58.083: E/AndroidRuntime(628): Caused by: Java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1285]:    37 cannot locate 'Rand'...
12-06 15:03:58.083: E/AndroidRuntime(628):  at Java.lang.Runtime.loadLibrary(Runtime.Java:370)
12-06 15:03:58.083: E/AndroidRuntime(628):  at Java.lang.System.loadLibrary(System.Java:535)
12-06 15:03:58.083: E/AndroidRuntime(628):  at org.pjsip.pjsua2.app.MyApp.<clinit>(MyApp.Java:235)

Il semble que l'application ne puisse pas charger la bibliothèque libpjsua2.so. Je n'ai jamais utilisé le NDK auparavant, donc je n'ai aucune idée sur ce problème, aidez-moi s'il vous plaît ...

21
Anton Galkin

Cela se produit si vous avez créé vos composants natifs avec le Android-21 cible, mais essayez de l'exécuter sur un appareil avec une ancienne version Android. À moins que vous ne fassiez très attention, vous ne pouvez pas exécuter de binaires créés avec le Android-21 cible sur les appareils plus anciens. Pour les fonctions C de base, peu importe la version cible entre Android-3 et Android-20 vous utilisez, cela devrait fonctionner sur tous, mais si vous utilisez Android-21 cela ne fonctionne que sur cette version et plus récente.

Voir https://stackoverflow.com/a/27093163/3115956 pour plus de détails sur ce problème.

30
mstorsjo

mstorsjo répond à ma question. Mais je veux écrire un commentaire: j'avais des fichiers de propriétés corrects, mais pendant la construction de pjsip, j'ai trouvé les journaux suivants:

sip@ubuntu:~/pjsip/trunk$ ./configure-Android
configure-Android: APP_PLATFORM not specified, using Android-21
configure-Android: TARGET_ABI not specified, using armeabi

Donc, si vous souhaitez compiler le projet sur une version de plate-forme spécifique, vous devez définir le paramètre APP_PLATFORM pour le script configure-Android.

TARGET_ABI=armeabi-v7a APP_PLATFORM=Android-8 ./configure-Android --use-ndk-cflags
11
Anton Galkin

Je l'ai rencontré lors de l'utilisation du téléphone HUAWEI avec opus et la bibliothèque jni pngquant pour Android. Enfin, la solution consiste à ajouter des implémentations de fonctions Rand, srand et atof dans mon fichier source. Ensuite, le problème a disparu.

Solution de https://github.com/cocos2d/cocos2d-x/issues/15234 Essayez-le!

static u_long myNextRandom = 1;

double atof(const char *nptr)

{
    return (strtod(nptr, NULL));
}

int Rand(void)
{
    return (int)((myNextRandom = (1103515245 * myNextRandom) + 12345) % ((u_long)Rand_MAX + 1));
}

void srand(u_int seed)
{
    myNextRandom = seed;
}
3
W. X