如何将现有的make文件与Android NDK合并

tha*_*guy 16 c android makefile android-ndk

所以我有一个庞大的现有C项目,我已放在$PROJECT/jni目录中.该项目通常通过运行配置脚本来创建,该脚本创建Makefile,然后允许通过编译项目make.

这个项目相当大,有许多目录包含源文件和头文件.

我想我在这里错过了一个如何运作的基本理解Android.mk.是否应该替换当前用于编译项目的configure和makefile?或者我将生成的makefile从我的配置脚本合并到Android.mk?他们提供的示例相当简单,只有少量源文件.我的jni目录看起来更像:

jni/
  folder1/subfolder1
  folder1/subfolder2
  folder1/source
  folder2/source
  .....
  foldern/source
  configure/
  configure/configure.sh
  Makefile
  Android.mk
Run Code Online (Sandbox Code Playgroud)

生成的makefile非常广泛(配置量很大,每个目录中都有一个)所以我很少迷失如何处理它.

编辑:

主要问题是NDK附带的示例是微不足道的例子.它们在顶级jni目录中有3-5个源文件.我的问题是,这是一个庞大的项目,配置复杂,有4个顶级文件夹,每个文件夹都有许多子目录.我不能简单地将源移动到jni文件夹并运行ndk编译器.

Gen*_*ene 14

要回答您的问题,是的Android.mk Android构建系统.谷歌几乎没有提到这个文件的"语言"是作为GNU make宏实现的.文档希望您根据这些宏描述您的项目.它们处理所有蹩脚的交叉编译细节.我很确定谷歌Android.mk在开发工具发展过程中采用这种方法来提高文件的前向可移植性.

结果是(我知道你不想听到这个)最好的答案可能就是Android.mk从头开始为你的大项目编写一个合适的NDK .

本文列出了我移植大约800个文件和300k SLOC的库的相同观察结果.不幸的是,我烧了差不多两个星期才得出同样的结论:交叉编译导致至少一些configure脚本失败(导致错误的config.h文件).我"发明"了他在文章中使用的几乎相同的技术.但即使我得到一个干净的构建,生成的静态库也无法完全运行.调试时间没有获得有用的信息.[警告:我不是配置工具专家.大师可能会发现我的错误.所以它.我花了几天时间来创造一个干净的Android.mk.生成的库首次运行所有测试.它已通过几次开发工具的清晰移植.

不幸的是,构建一个configure不使用自动工具的库就意味着config.h为目标环境手动构建自己的库.这可能没有听起来那么糟糕.IME系统倾向于在其configure环境中定义比实际使用更多的东西.清楚地了解真正的依赖关系可以在将来的重构过程中回报繁琐的工作.

文章中的摘要声明说明了一切:

Autotool仅适用于GNU系统,并且使用它进行交叉编译可能非常繁琐,令人困惑,容易出错甚至无法实现.这里描述的方法是一个黑客攻击,应该由您自己承担风险.

对不起,我没有更积极的建议.


Sam*_*een 5

我的回答与Gene的回答一致最好.

./configure创建配置文件的基础是C为每个测试编译(并可能运行)一小段代码.每个测试的成功在config.h.in模板中设置相应的变量来创建config.h.可以在交叉编译环境中成功测试仅编译测试.但是,编译运行测试无法在交叉编译环境中运行.

因此,要开始转换过程,你需要的环境变量设置CPP,CC,LD和其他工具的别名交叉编译器的工具集(从可能的那些NDK),然后运行./configure.完成此操作后,您需要更正config.h以匹配目标环境.这是您最关键且最容易出错的步骤.

至于Android.mk它,它遵循一个非常接近的格式Makefile.am,可以很容易地转换成它.你可以忽略Makefile.inMakefile,因为他们是从生成Makefile.am.

文件为例(版本5.11),我使用以下选项运行configure,

./configure --host arm-toshiba-linux-androideabi --build x86_64-linux-gnu \
            --prefix=/data/local/ host_alias=arm-linux-androideabi \
           "CFLAGS=--sysroot=~/ndk/platforms/android-8/arch-arm  -Wall -Wextra" \
           "CPPFLAGS=--sysroot=~/ndk/platforms/android-8/arch-arm" \
            CPP=arm-linux-androideabi-cpp
Run Code Online (Sandbox Code Playgroud)

下一步是采取src/Makefile.am以下措施:

MAGIC = $(pkgdatadir)/magic
lib_LTLIBRARIES = libmagic.la
include_HEADERS = magic.h

bin_PROGRAMS = file

AM_CPPFLAGS = -DMAGIC='"$(MAGIC)"'
AM_CFLAGS = $(CFLAG_VISIBILITY) @WARNINGS@

libmagic_la_SOURCES = magic.c apprentice.c softmagic.c ascmagic.c \
        encoding.c compress.c is_tar.c readelf.c print.c fsmagic.c \
        funcs.c file.h readelf.h tar.h apptype.c \
        file_opts.h elfclass.h mygetopt.h cdf.c cdf_time.c readcdf.c cdf.h
libmagic_la_LDFLAGS = -no-undefined -version-info 1:0:0
if MINGW
MINGWLIBS = -lgnurx -lshlwapi
else
MINGWLIBS =
endif
libmagic_la_LIBADD = $(LTLIBOBJS) $(MINGWLIBS)

file_SOURCES = file.c
file_LDADD = libmagic.la
CLEANFILES = magic.h
EXTRA_DIST = magic.h.in
HDR= $(top_srcdir)/src/magic.h.in
BUILT_SOURCES = magic.h

magic.h:        ${HDR}
        sed -e "s/X.YY/$$(echo @VERSION@ | tr -d .)/" < ${HDR} > $@
Run Code Online (Sandbox Code Playgroud)

Android.mk从此创造.

最后也是最重要的一步是修改config.h以准确反映目标系统的状态.这将是一个手动过程,我无法给出解决方法,主要涉及查看configure.log,查看标题和"调用"Google.这种劳动的成果可以在XDA上找到.