【问题标题】:Cannot load library: reloc_library[1285]: cannot locate 'rand'无法加载库:reloc_library [1285]:找不到“rand”
【发布时间】:2015-02-04 22:43:50
【问题描述】:

我正在尝试将 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,所以我对这个问题没有任何想法,请帮助我......

【问题讨论】:

标签: android android-ndk pjsip


【解决方案1】:

如果您使用 android-21 目标构建了本机组件,但尝试在具有较旧 Android 版本的设备上运行它,就会发生这种情况。除非您特别小心,否则您无法在旧设备上运行使用 android-21 目标构建的二进制文件。对于基本的 C 函数,您使用 android-3android-20 之间的哪个目标版本无关紧要,它应该适用于所有这些函数,但如果您使用 android-21,它仅适用于该版本和更高版本。

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

【讨论】:

  • “对于基本的 C 函数,这无关紧要......” 这大部分是正确的,但如果函数过去被定义为内联并且我们现在已经将它们提升为适当的符号,那就更是如此。手头没有完整的列表,但 iirc rand 就是其中之一。
  • 是的,我的评论意味着在 android-21 中确实发生了变化的普通 C 函数在 android-3 和 android-20 之间没有任何变化。因此,您可以使用 android-20(或 android-9)标头轻松构建,例如如果您希望有一个使用 OpenSL ES 的有条件使用的代码路径(使用 dlsym 动态加载,或内置到单独的 .so 中),同时仍然能够在 android-3 上运行。
  • 适用于 PJSIP 的 Android 示例应用程序的目标 SDK 版本为 15,我正在尝试在 API 级别 15 的 AVD 模拟器上启动。所以这不是根本原因。
  • 您确定完整的库已经使用目标 SDK 15 构建,包括原生部分(参见 project.properties、default.properties 和 jni/Application.mk),而不仅仅是前端示例应用程序本身?
  • 哦...是的,你是对的!问题出在 android 平台版本中。 project.properties 和 jni/Application.mk 是正确的,但 configure-android 脚本默认设置 android-21 版本。所以pjsip是用android-21平台版本构建的。
【解决方案2】:

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

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

【讨论】:

  • 我只是加了APP_PLATFORM=android-19
  • 酷!但还不够。重建也痛饮绑定。对于 pjsip-apps/src/swig/ 使用 make clean &amp;&amp; make.
  • 如何在build.gradle中添加APP_PLATFORM?
  • 只需使用环境变量 APP_PLATFORM 运行 configure-android 命令,就像我上面评论中的示例一样。
【解决方案3】:

我在使用带有 opus 和 pngquant jni 库的 HUAWEI 手机时遇到了这个问题。 最后的解决方案是在我的源文件中添加 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;
}

【讨论】:

    猜你喜欢
    • 2013-07-12
    • 1970-01-01
    • 2011-05-05
    • 2018-03-14
    • 2019-08-18
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多