【问题标题】:Using native Android system libraries outside NDK's stable API在 NDK 的稳定 API 之外使用原生 Android 系统库
【发布时间】:2012-12-05 11:38:11
【问题描述】:

我想知道是否可以在本机代码中使用不直接作为 NDK 的 API 公开的 Android 系统库。 特别是如何将它们包含在我的本机应用程序代码中,以便它们可以与之链接。 我知道不鼓励这样做,但我的项目在不同 Android 版本之间的兼容性不是问题。

我想要实现的是跳过 Android 提供的一些服务并尝试更靠近内核。 谢谢。

【问题讨论】:

  • 您可以从您的手机中提取并链接它,但您到底想要实现什么?如果您想靠近内核,只需编写自己的包装器来处理您想要的交互。您需要访问哪些类型的 so 文件?

标签: c++ linker android-ndk native android-library


【解决方案1】:

希望您理解,不建议对stable API以外的系统库有任何依赖。但 Android 的开放性允许(无论是在技术上还是在许可方面)引入这种依赖关系。从本质上讲,这意味着在非特许水域航行,并且不仅要准备好在平台的下一版本中进行 API 更改,还要在相同平台级别的供应商提供(即非 AOSP)设置中进行更改。

确保前向(和供应商)兼容性的最安全方法是将dynamic linking 用于未记录的系统功能,并在此过程中执行仔细的错误检查。

但在很多情况下,系统未记录的 API 实际上是相当稳定的,而且 Google 的 Android 团队中的好人不会经常进行重大更改。因此,如果您链​​接到 4.0 版本的 skia,您的代码很可能只会在 4.1.2 及更高版本上运行。

从技术上讲,您需要编译头文件和链接的 .so 文件。后者您可以从您自己的设备或模拟器图像中简单地adb pull /system/lib/libwhatever.so。您可以从https://android.googlesource.com/ git 存储库下载标头。确保您的标头与库版本匹配。

【讨论】:

  • 感谢您的建议!
  • 不会像这样拉取 .so 文件为您提供特定于平台的 .so 文件吗?
  • @Mark,是的,这些是特定于平台的库。您要做的最后一件事是将它们复制到不同的设备或版本。但我们只需要它们链接,将它们列在LOCAL_LDLIBS,而不是LOCAL_SHARED_LIBRARIES
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
相关资源
最近更新 更多