翻译原文:http://support.dcmtk.org/redmine/projects/dcmtk/wiki/Howto_CompileAndroid
DCMTK在许多操作系统上工作,如Windows、Mac OS和Linux。由于移动设备变得越来越重要,支持Android或iOS这样的平台也是必要的。本教程将介绍如何跨编译DCMTK,使用一个基于DCMTK的cmake构建Android工具链,关联Google的官方Android SDK和NDK。该构建在Linux和Windows下得到支持和测试,其他主机平台也可以工作。
先决条件:
根据您的主机操作系统,在编译过程中需要不同的外部软件包。独立于主机操作系统,需要以下软件包:
Android NDK,因为它包含了需要的工具链和用于交叉编译的运行时库。
Android SDK,它包含了用于配置和单元测试的Android设备模拟器。
由DCMTK使用的cmake构建系统来配置Android的编译过程,并提供单元测试框架。
如果您的操作系统附带了一个包管理器(例如,Debian),那么看看它是否提供了相关的包。这很可能会简化配置过程的其余部分。另外,如果您想在DCMTK中使用基于第三方库的扩展功能,那么这些库也需要作为Android的交叉编译二进制文件。
Linux:
大多数 linux 默认提供了所有额外的支持包。由于Android和Android NDK是基于基于linux的结构,因此可能是推荐的主机平台,以便跨编译DCMTK用于Android。因此更加推荐使用Linux。
Microsoft Windows
Windows操作系统需要以下附加的包:
MSYS需要启动Android设备模拟器,它是一个独立的异步过程。与本机Windows命令提示符(cmd.exe)相比,编译和运行单元测试也更舒适。确保将MSYS'bin'目录添加到PATH环境变量中,否则cmake否则将无法自动检测所需的可执行文件。
Android SDK的Windows版本有点不完整,例如,Android设备模拟器不能被cmake停产远程关闭(见这个bug)。此外,在Windows下,配置和构建步骤将运行得更慢。
Other host operating systems
目前还不支持其他主机操作系统。Unix系统(例如MacOS X)也可以工作,但是目前还没有得到明确的支持。
Setting up the Build Configuration
在安装了所有必需的软件并交叉编译各自需要的第三方库之后,您将不得不配置Android SDK,并创建一个模拟器配置供以后使用。然后,您可以通过cbuild设置项目构建配置,这些配置将在编译步骤中使用。
Configuring the Android device emulator
请确保安装Android SDK,以使其能够以适当的配置运行仿真器。关于这个目的,请参见本教程关于Android SDK的教程。确保为将要使用的API版本安装所需的系统映像。完成这一操作后,创建一个匹配的Android虚拟设备(AVD)配置,例如使用AVD管理器。配置可能如图1所示。
Setting up the build configuration via CMake
本节描述如何使用cmake的图形用户界面来设置构建配置。这是第一次这样做时推荐的,因为它允许您需要了解关于可用配置参数的概述,并提供了一个交互式界面,它可以轻松地指导您一步一步地绕过可能出现的错误。在您已经接受了相关的参数(例如cmake配制变量)之后,您可能会使用cmake配制的命令行接口而不是GUI,但是在本教程中,这将不会被描述,因为一旦您理解了配置过程,它就应该是不言而喻的。
第一步是将CMake指向源代码并构建目录,然后点击configure按钮。在类似Unix的主机操作系统和微软Windows下的MSYS makefile中选择Unix makefile。选择指定的工具链进行交叉编译,然后点击Next按钮(参见图2),然后您需要将CMake指向一个合适的Android工具链配置脚本。DCMTK提供了cmake中的android.toolchain.cmake。为了实现这个目的,你需要使用其他的首选方法。在DCMTK中提供的工具链文件是基于独立的OpenCV项目提供的文件,但是已经稍微适应了DCMTK的特殊需求。因此,在使用不同的文件时,您很可能会遇到问题,在这种情况下,您将不得不自己解决问题。
在选择了生成器和工具链文件之后,cmake生成器将尝试检测您的Android NDK和SDK。如果它们被安装到合适的位置(例如使用您的操作系统包管理器),这很可能是成功的,如果不是,则通常会失败。如果Android SDK无法检测到,您必须创建CMake变量ANDROID_NDK CMake指向你的NDK的位置(参见图3)。Android SDK的位置可能利用变量设置ANDROID_SDK_ROOT,将自动被添加到CMake缓存时,首先是必需的。您可以手动设置以下变量:
android android program——android程序在你的SDK中的位置。在Windows叫做 android.bat
。
android adb program——你的SDK中的adb程序的位置。在Windows叫做adb.exe。
android仿真器程序——在SDK中的模拟器程序的位置。在windows叫做emulator.exe。
在更改了这些变量之后,再次运行cmake更新刚才的配置。
Setting target device specific parameters
在CMake中知道NDK和SDK的位置之后,CMake将检测所有可用的工具链和所有当前的Android虚拟设备(AVD)配置。然后,配置过程将被停止,发出一个错误消息(参见图TODO)。这并不意味着错误的东西:喷出一个错误是唯一已知的方式中止CMake配置过程中为了调整目标设备具体设置你的喜好继续过程之前,需要做过相关配置测试执行。工具链文件将把所有的cmake变量变量设置为默认值,这对于很多用户来说都是有效的。但是,您应该确保这些值符合您的预期目的。下面是一个需要检查的最重要的变量的列表:
android abi——使用的应用程序二进制接口,可能的值的范围取决于安装的NDK。
android nativeapilevel——使用的应用程序接口版本,请注意DCMTK需要一些在每个API版本中都不存在的功能。
android工具链名称——使用的编译器工具链。NDK提供了不同的工具链,例如不同版本的GCC和Clang。
android stl——使用C++标准库实现。NDK提供了不同的STL实现,例如GNU STL和多平台STLport。
我们建议使用共享库来减少单个二进制文件的大小,例如gnustlshared。
请查看一下Android工具链文件中的注释,了解更多关于可用的cmake变量及其效果的信息。
工具链文件的独立性,在DCMTK的配置中存在更多的目标设备特定的变量。这些都是:
Android模拟器——在运行模拟器时使用的Android虚拟设备配置。最新版本的cmake入选将提供一个降序列表,仅限于所有可用的AVDs来简化选择。选择为这个目的准备的AVD。
android临时文件位置——用于存储临时文件的目标设备上的位置。如果在目标设备上没有写访问权限,则需要更改“/缓存”的默认值。
android stlsharedobject-这应该指向主机系统上的C++标准库实现共享对象(NDK的一部分),需要将其复制到目标设备上,因为所创建的二进制文件依赖于它。csearch将搜索一个在android stl中指定的文件,并且很有可能找到它自己。如果不是,请手动选择这个文件(只在使用共享C++标准库时才需要,否则,android stlsharedobject-notfound也很好)。
Other configuration parameters of DCMTK
为了控制DCMTK的配置,还存在几个额外的参数。看看这个页面,了解更多关于可用选项的信息。当针对一个容量有限的移动设备时,一个变量可能特别重要:
当启用时,这个变量告诉CMake来创建共享对象,而不是为DCMTK所包含的每个库建立静态库。这类似于使用C++标准库的共享版本(见上),也就是帮助减少单个二进制文件的大小。
Generating the build configuration
在您配置了所有DCMTK的设置之后,您可以再次点击“configure”按钮来运行配置过程。这将启动带有配置的AVD的Android设备模拟器,并运行几个配置测试。在Windows上,这将显示模拟器的主窗口,它允许您跟踪正在运行的模拟器实例。对于上面提到的bug,这是一种解决方案,它不允许CMake自动关闭模拟器。在cdo告诉你这样做之前,不要关闭模拟器窗口。
当CMake完成仅运行编译器的配置测试时,它将等待直到模拟器被访问,然后将一些文件传输到设备(到指定为android临时文件位置的位置)。然后,它将直接在模拟设备上运行一些配置测试,并将结果下载到本地配置。
当一切完成时,点击“生成”,这将会以配置的格式(Unix或MSYS makefile)创建构建脚本和配置文件。
Building DCMTK
构建DCMTK是使用在前一步中生成的构建脚本完成的。启动适当的命令shell(很可能是Linux下的终端模拟器和Windows下的MSYS),并导航到您的构建目录。然后键入“create”:这将启动构建过程,并创建DCMTK包含与前面步骤中配置的设置组成的库和模块。您可以使用“构建-jX”,其中X是同时运行的构建过程的数量,以减少构建持续时间。您也可以只构建单独的组件,例如“让make dcmdata”只构建dcmdata和它所依赖的库。运行“帮助”打印一个可用的构建目标列表。
请注意,在MSYS shell的某些版本中,运行同步构建过程是被破坏的。如果构建过程经常被困在中间,尝试使用不同版本的MSYS,或者只在单一的进程模式下运行。
Running the unit tests
在构建DCMTK成功之后,您可以运行所包含的单元测试,以验证DCMTK在配置的设置(例如:android nativeapilevel,……)中所做的工作。你可以通过“做测试”或“测试”来达到这个目标。这将把单元测试和所有依赖库(包括任何指定为“android stlsharedobject”)的库加载到仿真设备上。然后,所有的testcase将被运行,结果将从设备上下载并分析。
同样,在Windows上,当消息表明不再需要时,您将不得不手动关闭模拟器。
您可以运行“ctest-R-testcase-name”来运行单独的testcase,例如“ctest-R ofstdthread”,以测试线程实现是否符合预期。
Installing DCMTK
您可以通过运行“make install”安装创建的二进制文件并包含文件。安装位置将是cmakeinstall前缀指定的路径,默认设置为Android NDK内的适当位置。一方面,这是很方便的,因为它允许您的项目使用DCMTK,就好像它是NDK的一部分一样。但是另一方面,运行“make install”可能需要一个特权用户帐户(对于安装目录的写访问)。另一个缺点是,在进行这种处理时,您会得到一个“dirty” NDK目录。最后,由您决定安装位置,如果您想要运行安装步骤,或者直接使用来自构建目录的二进制文件。
Figure 1: Setting up the Android Virtual Device (AVD) configuration
Figure 2: Choosing the CMake generator and toolchain file
Figure 3: Adding the Variable ''ANDROID_NDK'' to the CMake cache
如果有比较大的错误,请帮忙指出!