【问题标题】:UnsatisfiedLinkError when run System.loadLibrary运行 System.loadLibrary 时出现 UnsatisfiedLinkError
【发布时间】:2020-09-16 08:42:07
【问题描述】:

我正在通过 android ndk 使用 pjsip 库。我使用 Android NDK 16 编译 pjsip。一位用户(HTC One,Android 5.0.2)在尝试启动我们的项目时遇到了很多崩溃。这是错误:

 Fatal Exception: java.lang.UnsatisfiedLinkError
dlopen failed: cannot locate symbol "stdin" referenced by "libpjsua2.so"...
... .PjSipApp.<clinit>

在项目中,我们有 4 个 abis 的 .so 文件,如 google android ndk 官方文档中所述:arm64-v8a、armeabi-v7a、x86、x86_64。 这是我在代码中加载库的方式:

public class PjSipApp {
    private static final String TAG = "Pjsua-PjSipApp";

    static {
        try {
            System.loadLibrary("openh264");
            System.loadLibrary("yuv");
        } catch (UnsatisfiedLinkError ignore) {
        }
        System.loadLibrary("pjsua2");
        Log.v(TAG, "LibraryLoaded");
    }...

所以System.loadLibrary("pjsua2"); 抛出这个UnsatisfiedLinkError。 也许有人知道,这是什么原因?

【问题讨论】:

  • 我有 32 位 .so 文件。你知道如何创建 64 位 .so 文件吗?在此先感谢:)

标签: android android-ndk pjsip pjsua2


【解决方案1】:

您可能编译了具有更高 API 级别的二进制文件。

这就是它们在stdio.h中的定义方式

#if __ANDROID_API__ >= 23
extern FILE* stdin __INTRODUCED_IN(23);
extern FILE* stdout __INTRODUCED_IN(23);
extern FILE* stderr __INTRODUCED_IN(23);
/* C99 and earlier plus current C++ standards say these must be macros. */
#define stdin stdin
#define stdout stdout
#define stderr stderr
#else
/* Before M the actual symbols for stdin and friends had different names. */
extern FILE __sF[] __REMOVED_IN(23);
#define stdin (&__sF[0])
#define stdout (&__sF[1])
#define stderr (&__sF[2])
#endif

因此,如果您为 API 级别 >= 23 构建,该符号将解析为 API File* stdin。我建议降低 API 级别。

【讨论】:

  • 谢谢你,你是对的。我尝试通过设置较低的 APP_PLATFORM 进行构建,并且成功了。但我也想知道,如果我为较低版本构建相同的库并在较新的设备上运行,它是否会影响安全问题(或者可能是任何其他问题,例如性能)?
  • @alla 我认为如果您针对较低的 API,不会有任何与安全相关的问题。尽管使用较新的 API 可能会带来性能优势(当然也易于使用)。如果您使用的是 Play 商店,则始终可以发布两个单独的 APK,一个用于较低版本,一个用于较高版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-29
相关资源
最近更新 更多