【问题标题】:How to link against native code in Android using NDK?如何使用 NDK 链接 Android 中的本机代码?
【发布时间】:2015-07-17 05:04:40
【问题描述】:

我稍微修改了一下,并认为这是一个有趣的项目,可以增强 Android 源中特定服务(即 Wifi、Location 和 Power 服务)提供的功能。

如果本机代码完全独立,我可以毫无问题地编译本机代码。但是,一旦我尝试包含不是传统 linux 或 libc 头文件的头文件,我就会在编译时遇到与定位这些文件相关的问题。

例如,Android 中的原生 wifi 实现可以在源代码树中的 hardware/libhardware_legacy/wifi/wifi.c 找到。当然,这个来源可能还包括标题和导致进一步定位问题的东西。

同样,一些原生电源函数位于hardware/libhardware_legacy/power/power.c

在使用 NDK 时链接这些本机实现的标准是什么?我的第二个想法是可能在编译时定义动态链接到加载的 wifi/location/power-related *.so,但我以前没有这样做过,我不确定该怎么做;不过,如果我能弄清楚哪个共享对象实现了这个本机代码,这可能是一个选择。

【问题讨论】:

  • 问:您指的是内核模块的源代码,还是用户空间代码。您可以使用 NDK 调用后者,但通常不能调用前者。查看here了解更多详情。
  • @paulsm4,有没有简单的方法可以判断?我想这些实现驻留在 kernel-space 中,因为用户显然不希望使用诸如位置服务之类的东西。在这种情况下,我应该考虑构建一个内核模块包装器或类似的东西。如果您无法链接到 kernel-space 代码,如何使用 NDK 构建内核模块?

标签: android android-ndk native dynamic-linking


【解决方案1】:

您提到的两个特定文件属于用户空间,但它们是未“记录”的库的一部分。你看到它们是因为 Android 是开源的,但你不能确定这些实现在所有 Android 设备上都是相同的。甚至他们的界面也可能在没有通知的情况下发生变化。

此外,Android 上的许多“用户空间”库只能从系统进程中使用,例如 mdeiaserver。即使您使用 root 访问权限 来解决对某些系统资源的访问权限,您也可能会失败,因为系统进程假定它可以完全控制例如相机设备。

如果您正在构建自定义 ROM,您有责任打包所有系统库,包括 libhardware_legacy.so。但是,当您构建自定义 ROM 时,您不会使用 NDK,即使 Android.mk 文件和使用的工具链之间有很多相似之处。

您可以了解很多关于扩展 AOSPhere

【讨论】:

    猜你喜欢
    • 2012-06-21
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 2011-10-08
    • 2016-02-09
    相关资源
    最近更新 更多