Série de pratiques de développement audio et vidéo Android-02-CMake compile rtmpdump

Table des matières

Introduction

Deux, cloner le code source de rtmpdump

3. Créez un nouveau projet C++ natif

4. Copiez le code source de librtmp dans le projet

5. Ajouter le script de construction CMake pour librtmp

6. Inclure le projet librtmp CMake en tant que dépendance de construction

7. Spécifiez le répertoire du fichier d'en-tête de la bibliothèque librtmp

Huit, bibliothèque librtmp associée

9. Modifiez le code native-lib.cpp pour imprimer le numéro de version de rtmp

Les références


Introduction

Dans la précédente série de pratiques de développement audio et vidéo Android-01-ndk-build compilant rtmpdump, l'article expliquait l'utilisation de ndk-build et MakeFile pour compiler la bibliothèque Rtmpdump sous la plate-forme Linux, mais parfois nous n'avons pas toujours les bonnes conditions pour le faire ainsi, par exemple, nous Le système Windows utilisé ne prend pas en charge MakeFile. Pour le moment, CMake est très approprié, et le volume de code de la bibliothèque Rtmpdump n'est pas très important, et la pression de compilation n'est pas grande. Cependant, pour x264, faac, ffmepg et d'autres bibliothèques, il est recommandé d'effectuer une compilation croisée et une comparaison sur la plate-forme Linux.

Deux, cloner le code source de rtmpdump

Site officiel de rtmpdump : http://rtmpdump.mplayerhq.hu/

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

Comme d'habitude, clonez d'abord le code source.

3. Créez un nouveau projet C++ natif

Créez un nouveau projet c++ natif et utilisez CMake pour créer JNI par défaut.

4. Copiez le code source de librtmp dans le projet

Ouvrez le répertoire source rtmpdump du clone.

Copiez le répertoire librtmp dans le répertoire /src/main/cpp du répertoire du projet :

5. Ajouter le script de construction CMake pour librtmp

Copiez CMakeLists.txt du répertoire cpp vers le répertoire librtmp :

Modifiez le contenu de CMakeLists.txt dans librtmp comme suit :

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

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

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

CMAKE_C_FLAGS : Options lors de la compilation de fichiers C, telles que -g ; vous pouvez également ajouter des options de compilation via add_definitions. Comme la bibliothèque librtmp est entièrement écrite en C, cette variable est utilisée.

Si les fichiers CPP sont inclus, CMAKE_CXX_FLAGS doit être utilisé .

Et -DNO_CRYPTO est une macro compilée, qui est utilisée pour configurer la bibliothèque librtmp pour ne pas utiliser la bibliothèque de chiffrement.Pour plus de détails, consultez l'article mentionné au début.

file : commande d'opération de fichier. L'option GLOB générera une liste de fichiers pour tous les fichiers correspondant à l'expression de la requête et stockera la liste dans une variable. Le librtmp ici est la variable qui stocke le fichier, et l'expression de requête utilise *.c pour correspondre à tous les fichiers c.

add_library : Une commande pour ajouter un fichier de code source ou une bibliothèque. Ici, le nom de la bibliothèque est défini sur rtmp et la commande target_link_libraries sera utilisée pour transmettre le nom de la bibliothèque rtmp lors de la liaison ultérieure de la bibliothèque . Utilisez STATIC pour définir la bibliothèque rtmp à compiler en tant que bibliothèque statique (.a/.lib) et utilisez SHARED si elle doit être compilée dans une bibliothèque dynamique (.so/.dll) . Pourquoi est-il compilé dans une bibliothèque statique ici ? Parce que du point de vue de l'intégration de la bibliothèque de fonctions, si vous souhaitez intégrer toutes les sous-bibliothèques publiées (plus d'une) dans une bibliothèque dynamique pour fournir une interface vers l'extérieur, vous devez alors compiler toutes les sous-bibliothèques dans des bibliothèques statiques, afin que toutes les sous-bibliothèques puissent être entièrement compilées Dans la bibliothèque dynamique cible, la bibliothèque dynamique finale qui intègre toutes les sous-bibliothèques fournit des fonctions externes. Enfin, fournissez le chemin relatif du code source, car le chemin de tous les fichiers source c de la bibliothèque rmtp a été stocké dans la variable librtmp using file, vous pouvez donc l'utiliser directement avec ${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}  )

Lecture étendue : la différence entre les bibliothèques statiques et les bibliothèques dynamiques

6. Inclure le projet librtmp CMake en tant que dépendance de construction

Le répertoire librtmp dans le répertoire cpp a son propre CMakeLists.txt et est également un projet CMake. Par conséquent, nous devons utiliser la commande add_subdirectory() dans CMakeLists.txt dans le répertoire cpp (le script de génération CMake de niveau supérieur, le fichier CMakeLists.txt configuré dans build.gradle , comme indiqué dans le code suivant) pour spécifier le Fichier CMakeLists.txt dans le répertoire librtmp Pour les dépendances de construction, la sortie de construction de librtmp sera incluse lors de la compilation.

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

Dans le fichier CMakeLists.txt du répertoire cpp, ajoutez une ligne :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. Spécifiez le répertoire du fichier d'en-tête de la bibliothèque librtmp

Pour que CMake trouve les fichiers d'en-tête au moment de la compilation, nous devons également ajouter la commande include_directories() au script de construction CMake et spécifier le chemin d'accès aux fichiers d'en-tête :

#指定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})

Huit, bibliothèque librtmp associée

Afin de permettre à la bibliothèque générée d'appeler les fonctions de la bibliothèque librtmp, nous devons également utiliser la commande target_link_libraries() dans le script de construction CMake pour associer la bibliothèque librtmp, recherchez la commande target_link_libraries dans le fichier CMakeLists.txt dans le cpp répertoire et modifiez-le comme suit :

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. Modifiez le code native-lib.cpp pour imprimer le numéro de version de rtmp

Modifiez le fichier native-lib.cpp dans le répertoire cpp, reportez-vous au fichier d'en-tête rtmp.h dans le répertoire librtmp et appelez RTMP_LibVersion pour obtenir le numéro de version et le renvoyer.

#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);
}

Enfin, compilez et exécutez comme suit :

Affichez avec succès le numéro de version de la bibliothèque rtmp. Jusqu'à présent, la bibliothèque Rtmpdump a été compilée.

Les références

Configurer CMake

Je suppose que tu aimes

Origine blog.csdn.net/xiangang12202/article/details/122186092
conseillé
Classement