Logo
Android NDK Cross-Compilation

Android: Compile FFmpeg 7 with OpenSSL (.so)

A complete guide to cross-compiling OpenSSL and FFmpeg 7 for Android arm64-v8a using the NDK Clang toolchain, and integrating it into Android Studio via JNI.

Prerequisites & Sources

Download the required source codes and NDK on your Linux/macOS host.

Architecture Note: This guide focuses on arm64-v8a (64-bit), which covers >95% of modern Android devices. Repeat the process with different flags for armeabi-v7a if 32-bit support is strictly required.

Step 1: Cross-Compile OpenSSL

OpenSSL must be compiled first so FFmpeg can link against it.

build_openssl_android.sh
#!/bin/bash

# 1. 设置 NDK 路径 (请替换为你自己的实际路径)
export ANDROID_NDK_ROOT=/opt/android-ndk-r26b
# 2. 将 NDK 的 llvm 工具链加入环境变量
export PATH=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH

# 3. 设置输出目录
PREFIX=$(pwd)/android_build/arm64-v8a

# 4. 配置 OpenSSL 构建 (注意: 目标为 android-arm64, API 指定为 24)
./Configure android-arm64 \
  -D__ANDROID_API__=24 \
  --prefix=$PREFIX \
  shared \
  no-engine no-hw 

# 5. 编译并安装 (使用 install_sw 避免安装文档报错)
make -j8
make install_sw

echo "✅ OpenSSL build completed!"

编译成功后,你会在 `android_build/arm64-v8a/lib` 下得到 `libssl.so` 和 `libcrypto.so`。

Step 2: Cross-Compile FFmpeg 7

Link the previously built libssl and libcrypto into FFmpeg.

build_ffmpeg_android.sh
#!/bin/bash

NDK=/opt/android-ndk-r26b
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
API=24

# 架构参数
ARCH=aarch64
CPU=armv8-a

# 输出目录与 OpenSSL 路径 (指向刚才第一步生成的目录)
PREFIX=$(pwd)/android_build/arm64-v8a
OPENSSL_DIR=/path/to/your/openssl/android_build/arm64-v8a

# 指定 Android Clang 编译器路径
CC=$TOOLCHAIN/bin/aarch64-linux-android${API}-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android${API}-clang++
CROSS_PREFIX=$TOOLCHAIN/bin/llvm-

./configure \
  --prefix=$PREFIX \
  --target-os=android \
  --arch=$ARCH \
  --cpu=$CPU \
  --enable-cross-compile \
  --cross-prefix=$CROSS_PREFIX \
  --cc=$CC \
  --cxx=$CXX \
  --enable-shared \
  --disable-static \
  --disable-doc \
  --disable-symver \
  --enable-openssl \
  --enable-nonfree \
  --extra-cflags="-I$OPENSSL_DIR/include -fPIC" \
  --extra-ldflags="-L$OPENSSL_DIR/lib -lssl -lcrypto"

make -j8
make install

echo "✅ FFmpeg build completed!"

成功后,你会在 FFmpeg 的输出目录下找到 `libavcodec.so`, `libavformat.so`, `libavutil.so` 等核心库。

Step 3: Android Studio & CMake

Import .so files and configure CMakeLists.txt

Directory Layout

Copy headers and shared libraries into your JNI folder.

app/src/main/cpp/
├── CMakeLists.txt
├── native-lib.cpp
├── include/ # ffmpeg 和 openssl 的头文件
└── jniLibs/arm64-v8a/
├── libavcodec.so
├── libavformat.so
├── libavutil.so
├── libssl.so
└── libcrypto.so

CMakeLists.txt 配置

cmake_minimum_required(VERSION 3.10.2)
project("ffmpeg_openssl_app")

# 1. 包含头文件目录
include_directories(${CMAKE_SOURCE_DIR}/include)

# 2. 设置 jniLibs 路径变量
set(MY_LIBS_DIR ${CMAKE_SOURCE_DIR}/jniLibs/${ANDROID_ABI})

# 3. 导入 FFmpeg 和 OpenSSL 动态库
add_library(avformat SHARED IMPORTED)
set_target_properties(avformat PROPERTIES IMPORTED_LOCATION ${MY_LIBS_DIR}/libavformat.so)
# ... (按此方法导入 avcodec, avutil, ssl, crypto) ...

# 4. 编译你自己的 JNI C++ 代码
add_library(native-lib SHARED native-lib.cpp)

# 5. 链接所有库到 native-lib
target_link_libraries(native-lib
    avformat avcodec avutil 
    ssl crypto 
    log # Android Log API
)

Step 4: Verify via JNI

Open an HTTPS stream to confirm OpenSSL is functioning correctly inside FFmpeg.

#include <jni.h>
#include <string>
#include <android/log.h>

extern "C" {
#include <libavformat/avformat.h>
#include <libavformat/avio.h>
}

#define LOG_TAG "FFmpegTest"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_myapp_MainActivity_testHttpsStream(JNIEnv* env, jobject /* this */) {
    // 1. 初始化 FFmpeg 网络模块 (必须)
    avformat_network_init();

    AVFormatContext *fmt_ctx = nullptr;
    const char *url = "https://devstreaming-cdn.apple.com/videos/streaming/examples/img_bipbop_adv_example_fmp4/master.m3u8";

    // 2. 打开输入的 HTTPS 视频流
    int ret = avformat_open_input(&fmt_ctx, url, nullptr, nullptr);
    if (ret < 0) {
        LOGE("❌ Failed to open HTTPS stream, Error code: %d", ret);
        return env->NewStringUTF("Failed to open HTTPS");
    }

    LOGI("✅ Successfully opened HTTPS stream!");
    LOGI("Format: %s, Duration: %lld", fmt_ctx->iformat->name, fmt_ctx->duration);

    // 3. 清理资源
    avformat_close_input(&fmt_ctx);
    avformat_network_deinit();

    return env->NewStringUTF("Success: HTTPS OpenSSL works!");
}
记得在 AndroidManifest.xml 中申请网络权限:<uses-permission android:name="android.permission.INTERNET" />

Explore More#mobile-dev

Integrating FFmpeg 7+ with Kotlin via JNI

Article

A complete, step-by-step visual guide to integrating pre-compiled FFmpeg 7 dynamic libraries (.so) into a modern Android project using CMake, JNI, and Jetpack Compose.

Android FFmpeg + C++: Video Cropping and Filter Processing

Article

A detailed demonstration of how to use FFmpeg and C++ in an Android project to implement video cropping, filter processing, and progress callbacks.

Integrating OpenCV 4.x in Android Studio

Article

A detailed step-by-step guide on how to integrate OpenCV 4.x into an Android Studio project, configure CMake and JNI, and implement image processing features.

Using OpenCV for Image Sharpening in Android

Article

A detailed step-by-step guide on how to integrate OpenCV into an Android project and implement image sharpening functionality.

Android OpenCV + FFmpeg 7: Making Videos Clearer from Blurry

Article

A detailed demonstration of how to use OpenCV and FFmpeg 7 in an Android project for video processing, achieving clarity from blurriness.

FFmpeg Android + OpenSSL Compilation Guide

Article

A detailed step-by-step guide on how to compile FFmpeg from source and integrate OpenSSL on the Android platform for HTTPS streaming support.

FFmpeg Xcode + Swift Compilation Guide

Article

A detailed step-by-step guide on how to compile FFmpeg from source using Xcode and Swift on macOS, and integrate it into an iOS project.

Android Image Similarity Detection and Grouping

Article

A detailed demonstration of how to use OpenCV in an Android project to implement image similarity detection and grouping features.