2

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

我正在尝试修改框架中的一些现有可执行文件,以便将它们作为 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 源框架来构建单个可执行文件而不必弄清楚依赖关系和链接?

4

2 回答 2

3

您可以看到该目录下有一个 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)

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

于 2013-03-14T11:52:44.530 回答
0

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

您可以修改Android.mkandroid 源代码树中的模块并更改

include $(BUILD_EXECUTABLE)

include $(BUILD_SHARED_LIBRARY)

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

例如,从 android 源代码基目录中,

mmm framework/base/cmds/screencap

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

于 2013-04-16T14:13:56.060 回答