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

1.新建c++项目

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

3.在SNKtool下安装CMake

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

c9a4370e02c3563aa43eaa3c63f88566.png

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的头文件添加进去

b73133d98dd612896879a448e1eefd7d.png

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

be92730d788baa601551c192291b8862.png

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

#include

#include

extern "C"{

#include

#include

}

#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.最后附上整个项目的结构图

1b2beb4e445b92a3ebc7a3d2c472e2c9.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值