[FFmpeg万能音频播放器]android CMake项目准备阶段(一)

大憨熊 提交于 2020-10-17 10:22:39

1.新建c++项目

2.配置NDK路径    这里建议配置NDK版本为:android-ndk-r15c

3.在SNKtool下安装CMake

4.新建Module 并且添加Module (这个module主要用来加载库与写jni)      new ->Module     FIle ->ProjectStructure

5.在新建的module中写Demo    也就是jni的java通信类

package com.example.myplayer;

public class Demo {

    static {
        System.loadLibrary("native-lib");
        System.loadLibrary("avutil");
        System.loadLibrary("swresample");
        System.loadLibrary("avcodec");
        System.loadLibrary("avformat");
        System.loadLibrary("swscale");
        System.loadLibrary("postproc");
        System.loadLibrary("avfilter");
        System.loadLibrary("avdevice");
    }

    public native String stringFromJNI();
    
    public native String showDetial();
}

6.新建的module中 cpp文件夹下 将FFmpeg的头文件添加进去  

7.新建的module中 在main路劲下新建jniLibs目录用来存放FFmpeg .so文件库

这里如果没有苦可以参考这篇https://blog.csdn.net/we1less/article/details/109039079

8.新建的module中  编写build.gradle文件

在    android {     defaultConfig {   下添加

externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions"
                abiFilters "x86"
            }
        }

在    android {  下添加

externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
            version "3.10.2"
        }
    }


sourceSets {
        main {
            jniLibs.srcDirs = ['src/main/jniLibs']
        }
    }

9.新建的module中  编写CMakeLists.txt

cmake_minimum_required(VERSION 3.4.1)

include_directories(src/main/cpp/include)


add_library(
             native-lib
             SHARED
           ${CMAKE_SOURCE_DIR}/src/main/cpp/native-lib.cpp)


add_library( avcodec
        SHARED
        IMPORTED)

set_target_properties( avcodec
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libavcodec.so)

add_library( avdevice
             SHARED
             IMPORTED)

set_target_properties( avdevice
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libavdevice.so)

add_library( avfilter
             SHARED
             IMPORTED)

set_target_properties( avfilter
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libavfilter.so)

add_library( avformat
             SHARED
             IMPORTED)

set_target_properties( avformat
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libavformat.so)

add_library( avutil
             SHARED
             IMPORTED)

set_target_properties( avutil
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libavutil.so)

add_library( swresample
             SHARED
             IMPORTED)

set_target_properties( swresample
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libswresample.so)

add_library( swscale
             SHARED
             IMPORTED)

set_target_properties( swscale
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libswscale.so)

add_library( postproc
             SHARED
             IMPORTED)

set_target_properties( postproc
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libpostproc.so)

target_link_libraries(
                        native-lib
                        avcodec
                        avdevice
                        avfilter
                        avformat
                        avutil
                        swresample
                        swscale
                        postproc
                        log )

10.编写cpp文件

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

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


#define LOG_TAG "godv"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)


extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_myplayer_Demo_stringFromJNI(JNIEnv *env, jobject thiz) {
    std::string hello = "Hello godv";

    return env->NewStringUTF(hello.c_str());
}

extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_myplayer_Demo_showDetial(JNIEnv *env, jobject thiz) {
    av_register_all();
    AVCodec *c_temp = av_codec_next(NULL);
    while (c_temp != NULL)
    {
        switch (c_temp->type)
        {
            case AVMEDIA_TYPE_VIDEO:
                LOGD("[Video]:%s", c_temp->name);
                break;
            case AVMEDIA_TYPE_AUDIO:
                LOGD("[Audio]:%s", c_temp->name);
                break;
            default:
                LOGD("[Other]:%s", c_temp->name);
                break;
        }
        c_temp = c_temp->next;
    }
    std::string hello = "Hello godv";
    return env->NewStringUTF(hello.c_str());
}

11.在mainactivity中调用

package com.example.godvmusic;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import com.example.myplayer.Demo;

public class MainActivity extends AppCompatActivity {

    private Demo mDemo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDemo = new Demo();
    }

    public void run(View view){
        mDemo.showDetial();
    }
}

12.最后附上整个项目的结构图

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!