Práctica de desarrollo de audio y video de Android series-02-CMake compile rtmpdump

Tabla de contenido

I. Introducción

Dos, clonar el código fuente de rtmpdump

3. Cree un nuevo proyecto nativo de C++

4. Copie el código fuente de librtmp al proyecto

5. Agregue el script de compilación CMake para librtmp

6. Incluya el proyecto librtmp CMake como una dependencia de compilación

7. Especifique el directorio del archivo de encabezado de la biblioteca librtmp

Ocho, biblioteca librtmp asociada

9. Modifique el código native-lib.cpp para imprimir el número de versión de rtmp

Referencias


I. Introducción

En la práctica anterior de desarrollo de audio y video de Android series-01-ndk-build compilación de rtmpdump, el artículo explicó el uso de ndk-build y MakeFile para compilar la biblioteca Rtmpdump en la plataforma Linux, pero a veces no siempre tenemos las condiciones adecuadas para hacerlo. entonces, por ejemplo, nosotros El sistema Windows utilizado no es compatible con MakeFile. En este momento, CMake es muy adecuado, y el volumen de código de la biblioteca Rtmpdump no es mucho, y la presión de compilación no es grande. Sin embargo, para x264, faac, ffmepg y otras bibliotecas, se recomienda realizar una compilación cruzada y una comparación en la plataforma Linux.

Dos, clonar el código fuente de rtmpdump

Sitio web oficial de rtmpdump: http://rtmpdump.mplayerhq.hu/

git clone git://git.ffmpeg.org/rtmpdump

Como de costumbre, primero clone el código fuente.

3. Cree un nuevo proyecto nativo de C++

Cree un nuevo proyecto nativo de C++ y use CMake para compilar JNI de forma predeterminada.

4. Copie el código fuente de librtmp al proyecto

Abra el directorio de origen rtmpdump del clon.

Copie el directorio librtmp en el directorio /src/main/cpp en el directorio del proyecto:

5. Agregue el script de compilación CMake para librtmp

Copie CMakeLists.txt en el directorio cpp al directorio librtmp:

Modifique el contenido de CMakeLists.txt en librtmp de la siguiente manera:

#配置C预编译宏
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNO_CRYPTO" )

#所有c源文件放入 librtmp 变量
file(GLOB librtmp *.c)

#编译静态库
add_library(rtmp STATIC ${librtmp} )

CMAKE_C_FLAGS : opciones al compilar archivos C, como -g; también puede agregar opciones de compilación a través de add_definitions. Dado que la biblioteca librtmp está escrita completamente en C, se utiliza esta variable.

Si se incluyen archivos CPP, se debe usar CMAKE_CXX_FLAGS .

Y -DNO_CRYPTO es una macro compilada, que se usa para configurar la biblioteca librtmp para que no use la biblioteca de cifrado.Para más detalles, consulte el artículo mencionado al principio.

archivo : comando de operación de archivo. La opción GLOB generará una lista de archivos para todos los archivos que coincidan con la expresión de consulta y almacenará la lista en variable. El librtmp aquí es la variable que almacena el archivo, y la expresión de consulta usa *.c para hacer coincidir todos los archivos c.

add_library : un comando para agregar un archivo de código fuente o una biblioteca. Aquí, el nombre de la biblioteca se establece en rtmp, y el comando target_link_libraries se usará para pasar el nombre de la biblioteca rtmp al vincular la biblioteca más tarde . Use STATIC para configurar la biblioteca rtmp para que se compile como una biblioteca estática (.a/.lib), y use SHARED si necesita compilarse en una biblioteca dinámica (.so/.dll) . ¿Por qué está compilado en una biblioteca estática aquí? Porque desde la perspectiva de la integración de la biblioteca de funciones, si desea integrar todas las subbibliotecas publicadas (más de una) en una biblioteca dinámica para proporcionar una interfaz con el exterior, debe compilar todas las subbibliotecas en bibliotecas estáticas. para que todas las subbibliotecas puedan compilarse completamente en la biblioteca dinámica de destino, la biblioteca dinámica final que integra todas las subbibliotecas proporciona funciones externas. Finalmente, proporcione la ruta relativa del código fuente, ya que la ruta de todos los archivos fuente c de la biblioteca rmtp se ha almacenado en la variable librtmp usando el archivo, por lo que puede usarla directamente con ${librtmp } .

# Specifies a library name, specifies whether the library is STATIC or
# SHARED, and provides relative paths to the source code. You can
# define multiple libraries by adding multiple add_library() commands,
# and CMake builds them for you. When you build your app, Gradle
# automatically packages shared libraries with your APK.

add_library( # Specifies the name of the library.
             rtmp

             # Sets the library as a shared library.
             STATIC

             # Provides a relative path to your source file(s).
             ${librtmp}  )

Lectura extendida: la diferencia entre bibliotecas estáticas y bibliotecas dinámicas

6. Incluya el proyecto librtmp CMake como una dependencia de compilación

El directorio librtmp en el directorio cpp tiene su propio CMakeLists.txt y también es un proyecto de CMake. Por lo tanto, necesitamos usar el comando add_subdirectory() en CMakeLists.txt en el directorio cpp (el script de compilación CMake de nivel superior, el archivo CMakeLists.txt configurado en build.gradle , como se muestra en el siguiente código) para especificar el Archivo CMakeLists.txt en el directorio librtmp Para dependencias de compilación, la salida de compilación de librtmp se incluirá al compilar.

externalNativeBuild {
    cmake {
        path file('src/main/cpp/CMakeLists.txt')
        version '3.10.2'
    }
}

En el archivo CMakeLists.txt en el directorio cpp, agregue una línea:add_subdirectory(librtmp)

# 添加位于librtmp目录下的 CMakeLists.txt 文件
# 作为构建依赖
add_subdirectory(librtmp)
# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library.

cmake_minimum_required(VERSION 3.10.2)

# Declares and names the project.

project("rtmpdumpjni")

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.

# 添加位于librtmp目录下的 CMakeLists.txt 文件
# 作为构建依赖
add_subdirectory(librtmp)

add_library( # Sets the name of the library.
        rtmpdumpjni

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        native-lib.cpp)

# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.

find_library( # Sets the name of the path variable.
        log-lib

        # Specifies the name of the NDK library that
        # you want CMake to locate.
        log)

# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.
        rtmpdumpjni

        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})

7. Especifique el directorio del archivo de encabezado de la biblioteca librtmp

Para que CMake encuentre los archivos de encabezado en el momento de la compilación, también debemos agregar el comando include_directories() al script de compilación de CMake y especificar la ruta a los archivos de encabezado:

#指定librtmp头文件查找路径
include_directories(librtmp)
# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library.

cmake_minimum_required(VERSION 3.10.2)

# Declares and names the project.

project("rtmpdumpjni")

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.

# 添加位于librtmp目录下的 CMakeLists.txt 文件
# 作为构建依赖
add_subdirectory(librtmp)

#指定librtmp头文件查找路径
include_directories(librtmp)

add_library( # Sets the name of the library.
        rtmpdumpjni

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        native-lib.cpp)

# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.

find_library( # Sets the name of the path variable.
        log-lib

        # Specifies the name of the NDK library that
        # you want CMake to locate.
        log)

# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.
        rtmpdumpjni

        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})

Ocho, biblioteca librtmp asociada

Para permitir que la biblioteca generada llame a las funciones en la biblioteca librtmp, también necesitamos usar el comando target_link_libraries() en el script de compilación de CMake para asociar la biblioteca librtmp, busque el comando target_link_libraries en el archivo CMakeLists.txt en el cpp directorio, y modifíquelo de la siguiente manera:

target_link_libraries( # Specifies the target library.
        rtmpdumpjni

        #编译并关联rtmp库到rtmpdumpjni库
        rtmp

        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})

9. Modifique el código native-lib.cpp para imprimir el número de versión de rtmp

Modifique el archivo native-lib.cpp en el directorio cpp, consulte el archivo de encabezado rtmp.h en el directorio librtmp y llame a RTMP_LibVersion para obtener el número de versión y devolverlo.

#include <jni.h>
#include <string>
#include "librtmp/rtmp.h"

extern "C" JNIEXPORT jstring JNICALL
Java_com_nxg_rtmpdumpjni_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    char version[100];
    sprintf(version, "rtmp version : %d", RTMP_LibVersion());
    return env->NewStringUTF(version);
}

Finalmente compilar y ejecutar de la siguiente manera:

Muestra con éxito el número de versión de la biblioteca rtmp. Hasta ahora, se ha compilado la biblioteca Rtmpdump.

Referencias

Configurar CMake

Supongo que te gusta

Origin blog.csdn.net/xiangang12202/article/details/122186092
Recomendado
Clasificación