无法加载库:reloc_library :找不到“rand”

我正在尝试为我的Android应用程序使用PJSIP库。 我build立了pjsua示例应用程序根据这个手册: https ://trac.pjsip.org/repos/wiki/Getting-Started/Android

但是当示例应用程序启动时,exception触发:

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,所以我对这个问题没有任何想法,请帮我…

如果您已经使用android-21目标构build了本机组件,但是尝试在具有较旧Android版本的设备上运行它,则会发生这种情况。 除非你非常小心,否则你不能在老设备上运行由android-21目标构build的二进制文件。 对于基本的C函数,你使用的android-3android-20之间的目标版本应该是无关紧要的,但是如果你使用的是android-21它只能在那个版本和更新的版本上工作。

有关此问题的更多详细信息,请参阅https://stackoverflow.com/a/27093163/3115956

mstorsjo回答我的问题。 但我想写一个评论:我有正确的属性文件,但在pjsipbuild设期间,我发现以下日志:

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

所以如果你想在一些特定的平台版本上编译项目,你必须为configure-android脚本设置APP_PLATFORM参数。

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

我在使用安装opus和pngquant jni库的华为手机时遇到过这个问题。 最后的解决办法是在源文件中添加rand,srand和atof函数实现。 然后问题消失了。

解决scheme从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; }