Невозможно загрузить библиотеку: 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, поэтому у меня нет никаких идей по этой проблеме, пожалуйста, помогите мне...
Ответы
Ответ 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;
}