【问题标题】:Android OS framework - building individual executables as a shared objectAndroid OS 框架 - 将单个可执行文件构建为共享对象
【发布时间】:2013-03-02 17:34:22
【问题描述】:

我只是这方面的初学者,所以请耐心等待 -

我正在尝试修改框架中的一些现有可执行文件,以便将它们作为 SO 包含在应用程序中(修改允许我从方法调用中获取返回的结果,而不是在命令行),

不幸的是,我发现很难隔离和构建它们。

例如,screencap 可执行文件:

http://androidxref.com/4.1.1/xref/frameworks/base/cmds/screencap/

您可以从screencap.cpp 文件中看到它只使用(android)系统头文件:

#include <errno.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>

#include <linux/fb.h>
#include <sys/ioctl.h>
#include <sys/mman.h>

#include <binder/IMemory.h>
#include <gui/SurfaceComposerClient.h>

#include <SkImageEncoder.h>
#include <SkBitmap.h>
#include <SkData.h>
#include <SkStream.h>

虽然我可以发现这些标头散落在 Android 源代码树周围,但单独将它们全部链接以进行自定义构建将非常耗时 -

我的问题是,我如何使用 android 源框架来构建只是单个可执行文件,而无需弄清楚依赖关系和链接?

【问题讨论】:

    标签: android c++ android-ndk operating-system


    【解决方案1】:

    您可以看到该目录下有一个 Android.mk。

    因此,如果您想构建该特定模块:screencap。

    只需通过以下方式设置 Android 构建环境:

    export SHOW_COMMANDS=1
    . build/envsetup.sh
    lunch 1
    mmm screencap
    

    然后你会得到你的可执行文件。在构建过程中,您可以看到 Android 如何构建您的可执行文件,包括那些 g++ 命令。

    更新

    我想将 screencap.cpp 等文件中包含的代码用作 Android 应用中较大的 ndk-build 项目的一部分

    更改该目录下的 Android.mk 文件,或者您可以将该目录复制到其他位置。

    在其中添加几个语句来构建一个静态库。

    include $(BUILD_SHARED_LIBRARY)
    

    然后将静态库添加到您的应用程序中。它应该工作。

    【讨论】:

    • 对不起,杰梅因,我没有尽我所能解释自己。尽管您的回答对我提出的问题非常有用 - 我实际上是在尝试在 Android 应用程序 ndk-build 的隔离中构建代码
    • 我稍作修改,但仍然无法理解您的意思。这就是我们构建 Android 的方式。能不能对“一个Android应用ndk-build的隔离”做一些说明?
    • 因此,您发布的代码确实构建了可执行文件。但是,我想将 screencap.cpp 等文件中包含的代码用作 Android 应用程序中较大的 ndk-build 项目的一部分 - 而不是作为自定义 ROM 的一部分。我已经构建了代码所依赖的共享对象,但无法正确链接系统头链。
    • 先试试 rm -rf out/@Graeme
    • 抱歉,我一定是错的,所以对于“对‘所有模块’无能为力”的更好解决方案是稍微改变一下,比如在该文件中添加一些空格,然后再次 mmm。 @格雷姆
    【解决方案2】:

    (@Jermain Xu 的回答更精简的版本)

    你可以在android源码树中修改模块的Android.mk并改变

    include $(BUILD_EXECUTABLE)
    

    include $(BUILD_SHARED_LIBRARY)
    

    为了将这个模块构建为一个共享库,允许它被链接。它需要完整的完整构建才能链接,但您可以使用mmm 命令指向模块(此实例中的模块是包含Android.mk 文件的目录)。

    例如来自 android 源代码基目录,

    mmm framework/base/cmds/screencap
    

    这将回显构建的 .so 文件的位置,该文​​件应该可以在您自己的应用中链接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      • 2023-03-18
      • 2022-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      相关资源
      最近更新 更多