Подтвердить что ты не робот

Невозможно загрузить библиотеку: reloc_library [1285]: не удается найти "rand"

Я пытаюсь использовать PJSIP-библиотеку для своего приложения для Android. Я создал приложение примера pjsua в соответствии с этим руководством: https://trac.pjsip.org/repos/wiki/Getting-Started/Android

Но когда запускается приложение-образец, триггеры исключений:

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)

Кажется, что appl не может загрузить библиотеку libpjsua2.so. Я никогда раньше не использовал NDK, поэтому у меня нет никаких идей по этой проблеме, пожалуйста, помогите мне...

4b9b3361

Ответ 1

Это происходит, если вы создали свои собственные компоненты с целью android-21, но пытаетесь запустить его на устройстве со старой версией Android. Если вы не проявляете особой осторожности, вы не можете запускать двоичные файлы, созданные с помощью android-21 на старых устройствах. Для базовых функций C не имеет значения, какая целевая версия между android-3 и android-20 вы используете, она должна работать на всех из них, но если вы используете android-21, она работает только с этой версией и новее.

Подробнее об этой проблеме см. fooobar.com/questions/251034/....

Ответ 2

mstorsjo отвечает на мой вопрос. Но я хочу написать один комментарий: У меня были правильные файлы свойств, но во время создания pjsip я нашел следующие журналы:

[email protected]:~/pjsip/trunk$ ./configure-android
configure-android: APP_PLATFORM not specified, using android-21
configure-android: TARGET_ABI not specified, using armeabi

Итак, если вы хотите скомпилировать проект на определенной версии платформы, вам нужно установить параметр APP_PLATFORM для configure-android script.

TARGET_ABI=armeabi-v7a APP_PLATFORM=android-8 ./configure-android --use-ndk-cflags

Ответ 3

Я столкнулся с этим при использовании телефона HUAWEI с библиотекой opus и pngquant jni для Android. Наконец, решение состоит в том, что я добавляю в исходный файл rand, srand и atof функции. Тогда проблема исчезла.

Решение https://github.com/cocos2d/cocos2d-x/issues/15234 Попробуйте!

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;
}