运行System.loadLibrary时出现UnsatisfiedLinkError

问题描述

我正在通过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。 也许有人知道,这是什么原因?

解决方法

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

这是它们在stdio.h

中的定义
Uncaught SyntaxError: The requested module '../libs/STLLoader.js' does not provide an export named 'STLLoader'

因此,如果您是针对API级别> = 23构建的,则该符号将解析为API #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级别。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...