快捷搜索: 王者荣耀 脱发

安卓平台文字叠加库freetype的编译

freetype是一款跨平台开源的文字叠加库,支持对图像,视频进行文字叠加.

做多媒体开发的小伙伴大概都知道文字叠加是个刚需.所以最近研究了一下freetype库在安卓平台的编译过程.

下载

freetype 可在https://freetype.org/download.html下载,目前最新版本是2.11.1.

配置

freetype是一个标准的GNU Autotools生成的项目.其原理是:1 使用configure生成Makefile,2 make. 我们这里要做的就是修改configure的输出参数,来适配到安卓平台.

我借鉴了一些第三方的配置项目,创建了build_android.sh脚本,过程略过,内容如下. 具体见freetype-2.11.1/build_android.sh:

#!/bin/bash

FFMPEG_EXT_PATH=`pwd`
NDK_PATH="/Users/pro21/Downloads/android-ndk-r21e/"
HOST_PLATFORM="darwin-x86_64"
ENABLED_DECODERS=("${@:4}")
JOBS=$(nproc 2> /dev/null || sysctl -n hw.ncpu 2> /dev/null || echo 4)
echo "Using $JOBS jobs for make"

COMMON_OPTIONS="
    --with-zlib=no
    --with-bzip2=no
    --with-png=no
    --with-harfbuzz=no
    --with-brotli=no
    --with-sysroot=${SYSROOT}
    "
TOOLCHAIN_PREFIX="${NDK_PATH}/toolchains/llvm/prebuilt/${HOST_PLATFORM}/bin"
SYSROOT="${NDK_PATH}/toolchains/llvm/prebuilt/${HOST_PLATFORM}/sysroot"

cd "${FFMPEG_EXT_PATH}"
make clean
FOLDER=`pwd`/android-libs/armeabi-v7a
mkdir -p ${FOLDER}
CC=${TOOLCHAIN_PREFIX}/armv7a-linux-androideabi16-clang 

./configure 
    --prefix=${FOLDER} 
    --libdir=${FOLDER} 
    --host=arm-linux-androideabi 
    --enable-neon  --enable-thumb --disable-gpl --disable-nonfree --enable-runtime-cpudetect 
    ${COMMON_OPTIONS}
make -j$JOBS && make install

make clean

FOLDER=`pwd`/android-libs/arm64-v8a
mkdir -p ${FOLDER}
CC=${TOOLCHAIN_PREFIX}/aarch64-linux-android21-clang 
./configure 
    --prefix=${FOLDER} 
    --libdir=${FOLDER} 
    --host=aarch64-linux-android 
    --enable-debug 
    ${COMMON_OPTIONS}
make -j$JOBS && make install

make clean
FOLDER=`pwd`/android-libs/x86
mkdir -p ${FOLDER}
CC=${TOOLCHAIN_PREFIX}/i686-linux-android16-clang 
./configure 
    --prefix=${FOLDER} 
    --libdir=${FOLDER} 
    --host=i686-linux-android 
    ${COMMON_OPTIONS}
make -j$JOBS && make install

编译

cd到 freetype-2.11.1,更改build_android.sh里面的NDK环境为自己的编译环境,包括NDK_PATH和HOST_PLATFORM,然后执行:

sh build_android.sh

编译成功后,动态库位于android-libs目录.

编译Android JNI

    cd 到 android/library/freetype_jni 执行 ndk-build

测试项目

通过AS打开安卓项目,执行测试代码: android/library/src/androidTest/java/com/tsinglink/android/library/TextDrawTest.kt

安卓端接口调用

// 创建 TextDraw 实例
val draw = TextDraw()
// 设置字库,文字大小,旋转角度:
draw.init("/system/fonts/NotoSansCJK-Regular.ttc",20,0.0f)
// 在20,120处叠加文字. frame为叠加的图像帧,YUV格式.width,height表示图像帧的宽高
// draw方法可以多次调用.
draw.draw("你好 hello ", 20, 120, frame, width, height)
// 释放实例
draw.release()

叠加效果展示

draw.draw("""Log.i(TAG,"你好 hello ")""", 20, 30, frame, width, height)
draw.draw("""Log.i(TAG,"こんにちは hello ")""", 20, 60, frame, width, height)

draw.draw("你好 hello ", 20, 120, frame, width, height)
draw.draw("こんにちは hello ", 20, 150, frame, width, height)

项目地址

https://github.com/tsinglink/android-freetype

经验分享 程序员 微信小程序 职场和发展