我只是一个初学者,所以忍受我 -
我正在尝试修改框架中的一些现有可执行文件,以便将它们作为一个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源代码框架构建只是单个可执行文件,而不必弄清楚依赖关系和链接?
答案 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
文件的位置,该文件应该可以在您自己的应用中链接。