Android NDK交叉编译OpenCV下Freetype库


本文将介绍在Android NDK下交叉编译OpenCV下Freetype库的方法。

一、前言

在Android中,使用NDK进行c/c++开发是非常常见的。在一些场景中,我们需要在Android NDK中使用Freetype库,来进行字体的渲染处理。

本文的主要内容将分为三个部分:第一部分主要介绍关于NDK的相关知识;第二部分主要介绍关于OpenCV的相关知识;第三部分将具体介绍如何在Android NDK下编译OpenCV下Freetype库。

二、NDK基础知识

1、什么是NDK

NDK全称为:Native Development Kit,即原生开发工具包。

NDK是Android提供的一个可以让开发者用C/C++等本机语言来开发Android应用的工具集。它提供了一系列工具和API,使得开发人员可以在NDK环境中轻松编写C/C++代码,并将其打包到Android应用中,使用Android应用程序框架的许多功能,从而获得更高的性能。

2、NDK和SDK有哪些区别

SDK(Software Development Kit)是用于开发Android应用程序的软件开发工具包,可以通过SDK下载器从Google官方获得。SDK中包括了Android开发中的各种API、SDK工具、模拟器、开发文档等资源。

NDK( Native Development Kit)是一款由Google提供的用于开发Android程序的Native工具集,它主要是提供了在Android应用程序中使用C和C++语言开发的功能,主要包括:C/C++源文件的交叉编译、C/C++库的生成、调试和测试等功能。

二者的区别主要是开发语言的不同,SDK是为开发Java语言的应用程序而设,而NDK是为开发C/C++语言的应用程序而设。

三、OpenCV基础知识

1、什么是OpenCV

OpenCV(Open Source Computer Vision)是一个开源的计算机视觉库。它采用C++语言编写,并在BSD许可证下发布。该库包含了大量的计算机视觉和机器学习算法,包括但不限于图像处理、OCR、目标检测、人脸识别、跟踪、3D重建等等,是一个广泛应用于计算机视觉领域的开源库。

OpenCV的优点是:跨平台、高效、免费和开源。

2、OpenCV在Android上的应用

OpenCV在Android平台上的使用也是非常广泛的。由于其高效、免费和开源的优点,使得其在Android平台上成为开发者最喜欢使用的计算机视觉库之一。使用OpenCV,开发者可以轻松地开发出高效、精确的计算机视觉应用。

四、在Android NDK下编译OpenCV下Freetype库

1、下载NDK

首先要下载最新版本的NDK:

https://developer.android.com/ndk/downloads/

下载完NDK后,我们需要解压它到需要的目录下,比如下面的目录:/opt/android-ndk-r21b。

2、下载OpenCV并编译

在下载并安装好NDK后,接下来我们需要下载并编译OpenCV。在这里我们使用OpenCV的官方GitHub仓库:

https://github.com/opencv/opencv

我们可以直接在终端中运行以下命令来获取GitHub仓库:

git clone https://github.com/opencv/opencv.git

然后在终端中进入下载好的OpenCV目录,并使用下面的命令进行OpenCV的编译:

cd opencv/
mkdir build
cd build/
cmake -DCMAKE_TOOLCHAIN_FILE=/opt/android-ndk-r21b/build/cmake/android.toolchain.cmake \
      -DANDROID_ABI=armeabi-v7a \
      -DANDROID_NATIVE_API_LEVEL=android-16 \
      -DANDROID_TOOLCHAIN=clang \
      -DANDROID_STL=c++_static \
      -DBUILD_opencv_java=OFF \
      -DBUILD_opencv_python=OFF \
      -DBUILD_TESTS=OFF \
      -DBUILD_PERF_TESTS=OFF \
      -DBUILD_ANDROID_EXAMPLES=OFF \
      -DBUILD_ANDROID_PROJECTS=OFF \
      -DBUILD_OPENCL=OFF \
      -DBUILD_opencv_world=ON \
      -DWITH_FREETYPE=ON \
      -DFREETYPE_INCLUDE_DIRS=/usr/include/freetype2 \
      -DFREETYPE_LIBRARY_DIRS=/usr/lib/arm-linux-gnueabihf \
      -DFREETYPE_LIBRARIES=freetype \
      ../
make -j${nproc}
sudo make install

解释:

  • cmake -DCMAKE_TOOLCHAIN_FILE=/opt/android-ndk-r21b/build/cmake/android.toolchain.cmake \:指定使用ndk的toolchain文件。
  • -DANDROID_ABI=armeabi-v7a \:Android平台的指令集体系结构,这里选择的是armv7。
  • -DANDROID_NATIVE_API_LEVEL=android-16 \:需要兼容的最低API级别,这里选择的是16。
  • -DANDROID_TOOLCHAIN=clang \:使用clang来作为编译器。
  • -DANDROID_STL=c++_static \:使用静态链接C++库。
  • -DBUILD_opencv_java=OFF \:不编译Java代码。
  • -DBUILD_opencv_python=OFF \:不编译Python代码。
  • -DBUILD_TESTS=OFF \:不编译测试代码。
  • -DBUILD_PERF_TESTS=OFF \:不编译性能测试代码。
  • -DBUILD_ANDROID_EXAMPLES=OFF \:不编译Android平台下的示例代码。
  • -DBUILD_ANDROID_PROJECTS=OFF \:不编译Android平台下的项目代码。
  • -DBUILD_OPENCL=OFF \:不编译OpenCL支持。
  • -DWITH_FREETYPE=ON \:启用Freetype库。
  • -DFREETYPE_INCLUDE_DIRS=/usr/include/freetype2 \:Freetype库的头文件路径。
  • -DFREETYPE_LIBRARY_DIRS=/usr/lib/arm-linux-gnueabihf \:Freetype库的链接库路径。
  • -DFREETYPE_LIBRARIES=freetype \:Freetype库的名称。
  • make -j${nproc}:并发编译。
  • sudo make install:安装编译好的库文件。

3、Freetype库编译和安装

首先需要去Freetype的官网上下载最新版本:

https://www.freetype.org/download.html

下面提供一个例子:

wget https://download.savannah.gnu.org/releases/freetype/freetype-2.10.1.tar.gz
tar xfz freetype-2.10.1.tar.gz
cd freetype-2.10.1/

接下来我们就可以开始编译Freetype库了:

./configure --host=arm-linux-androideabi --prefix=$ANDROID_TOOLCHAIN/sysroot/usr
make
make install

这里,我们使用了一个--host参数来指定了我们要编译的平台,这里选择的是arm-linux-androideabi。还有一个--prefix参数,这个参数是用来设置Freetype库安装位置的,这里设置的是$ANDROID_TOOLCHAIN/sysroot/usr,这里的$ANDROID_TOOLCHAIN是我们在安装NDK时选择的位置。

4、交叉编译Freetype库

到这里,我们需要回到OpenCV的build目录,接下来使用以下命令编译freetype库:

cd ../../3rdparty/freetype/
mkdir build
cd build/
cmake -DCMAKE_TOOLCHAIN_FILE=/opt/android-ndk-r21b/build/cmake/android.toolchain.cmake \
      -DANDROID_ABI=armeabi-v7a \
      -DANDROID_NATIVE_API_LEVEL=android-16 \
      -DANDROID_TOOLCHAIN=clang \
      -DANDROID_STL=c++_static \
      -DCMAKE_INSTALL_PREFIX=$ANDROID_TOOLCHAIN/sysroot/usr \
      ../
make
make install

解释:

  • cmake -DCMAKE_TOOLCHAIN_FILE=/opt/android-ndk-r21b/build/cmake/android.toolchain.cmake \:指定使用ndk的toolchain文件。
  • -DANDROID_ABI=armeabi-v7a \:Android平台的指令集体系结构,这里选择的是armv7。
  • -DANDROID_NATIVE_API_LEVEL=android-16 \:需要兼容的最低API级别,这里选择的是16。
  • -DANDROID_TOOLCHAIN=clang \:使用clang来作为编译器。
  • -DANDROID_STL=c++_static \:使用静态链接C++库。
  • -DCMAKE_INSTALL_PREFIX=$ANDROID_TOOLCHAIN/sysroot/usr \:指定安装路径。
  • make:编译。
  • make install:安装。

5、验证编译结果

编译完成后,可以在文件系统中找到一些构建好的共享库。在OpenCV的build目录内,可以找到构建结果的共享库文件。构建结果的文件路径为:opencv/build/lib/。

在此文件夹中,检查是否存在以下文件:

  • libopencv_freetype.a或libopencv_freetype.so
  • libfreetype.a或libfreetype.so

五、总结

本文主要介绍了如何在Android NDK下编译OpenCV下Freetype库。以上步骤需要一定的编译经验和编译知识,但只要按照文中的步骤,就可以轻松地完成编译。

评论关闭