首页 > 解决方案 > 在启动时是否需要对共享库中的函数的引用,或者直到实际使用才需要?

问题描述

注意:这个问题与编译期间的链接无关。

我问这个问题是因为在 Android 中我们必须处理不同的平台版本,而旧平台可能会缺少一些 libc 函数。

由于大多数人(包括我)都是针对最新的平台 SDK 构建的,所以我们总是可以链接到最新版本的仿生 libc,即使我们引用了仅在较新平台中出现的东西,编译也可以通过。

在 Java 中,通常会执行以下操作:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    // Call new API.
} else {
    // Work around without the new API.
}

这样,即使编译后的字节码包含对新 API 的引用,它也会在旧 API 上正常执行,因为不会到达该引用。

所以我想知道我们是否可以在 C 中有类似的东西:

if (android_get_device_api_level() >= __ANDROID_API_P__) {
    // Call new libc function.
} else {
    // Work around without the new function.
}

即使引用了新功能,这是否可以在旧平台上工作?即Linux会为我们加载旧的libc,尽管缺少一些符号,还是会在启动时被拒绝?

标签: androidclinkershared-libraries

解决方案


推荐阅读