Android OS框架 - 将单个可执行文件构建为共享对象

时间:2013-03-14 11:34:02

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

我只是一个初学者,所以忍受我 -

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

2 个答案:

答案 0 :(得分: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)

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

答案 1 :(得分:0)

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

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

include $(BUILD_EXECUTABLE)

include $(BUILD_SHARED_LIBRARY)

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

例如来自android源码目录

mmm framework/base/cmds/screencap

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