运行 System.loadLibrary 时出现 UnsatisfiedLinkError
UnsatisfiedLinkError when run System.loadLibrary
我正在通过 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 级别的二进制文件。
中是这样定义的
#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 构建,该符号将解析为 File* stdin
,这在 API < 23 中不存在。我建议降低 API 水平。
我正在通过 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 级别的二进制文件。
中是这样定义的#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 构建,该符号将解析为 File* stdin
,这在 API < 23 中不存在。我建议降低 API 水平。