android studio 加载ffmpeg.so,Android studio使用已经编译好的ffmpeg .so库

本文详细介绍了如何在Android Studio项目中集成C++代码和FFmpeg库,包括新建工程时选择Native C++,修改build.gradle配置,指定CMakeLists.txt路径,设置.so库支持的CPU架构,以及将编译好的FFmpeg库引入项目。通过示例展示了C++代码的编写和Java层的调用方法,提供了完整的CMakeLists.txt配置示例。
摘要由CSDN通过智能技术生成

一. 从C++返回hello world

这一步是android studio自带功能

新建工程时选择native c++即可

50a7e65fd5e5

Screenshot from 2020-12-10 00-41-57.png

做一个简单的记录

build.gradle

3处修改

android {

compileSdkVersion 29

buildToolsVersion "29.0.3"

defaultConfig {

minSdkVersion 19

targetSdkVersion 29

versionCode 1

versionName "1.0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

consumerProguardFiles "consumer-rules.pro"

// 1) 设置cppFlags

externalNativeBuild {

cmake {

cppFlags ""

}

}

}

buildTypes {

release {

minifyEnabled false

proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

}

}

// 2) 指定 CMakeLists.txt的路径和版本

externalNativeBuild {

cmake {

path "src/main/cpp/CMakeLists.txt"

version "3.10.2"

}

}

// 3)as 3.6.3上需要加上这段代码,告诉gradle本地库的路径,4.0上不需要

sourceSets {

main {

jniLibs.srcDirs = ['src/main/ffmpegLibs/lib']

}

}

}

编写jni代码和对应的java调用代码

jni代码

#include

#include

//这里的方法名字要和调用层 FFmpegWrapper的方法签名保持一致,

//并且如果源文件是C++代码,要加上extern "C",不然会影响链接器链接,导致找不到方法

``

extern "C"

JNIEXPORT jstring JNICALL

Java_com_lv_ffmpeg_FFmpegWrapper_ffmpegVersion(JNIEnv *env, jobject thiz) {

std::string hello = "Hello from C++";

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

}

java调用代码

public class FFmpegWrapper {

//加载.so

static {

System.loadLibrary("native-lib");

}

public native static String ffmpegVersion();

}

编写CmakeFile

# 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.4.1)

# 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.

add_library( # Sets the name of the library.

native-lib

# 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.

native-lib

# Links the target library to the log library

# included in the NDK.

${log-lib} )

二. 使用编译好的.so

设置支持的CPU架构

defaultConfig {

applicationId "com.lv.media_demo"

minSdkVersion 19

targetSdkVersion 29

versionCode 1

versionName "1.0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

//由于编译的.so是架构类型是arm64-v8a,所以这里限制只支持'arm64-v8a

ndk {

//abiFilters 'armeabi-v7a' //, 'arm64-v8a', 'x86', 'x86_64', 'mips', 'mips64'

abiFilters 'arm64-v8a' //, 'arm64-v8a', 'x86', 'x86_64', 'mips', 'mips64'

}

}

复制头文件和.so文件到工程

50a7e65fd5e5

Screenshot from 2020-12-10 01-01-49.png

修改cmakefile.txt

有4出修改

# 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.4.1)

# 1) 设置.so和头文件存放的位置

set(jni_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../ffmpegLibs)

# 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.

add_library( # Sets the name of the library.

native-lib

# Sets the library as a shared library.

SHARED

# Provides a relative path to your source file(s).

native-lib.cpp)

# 2) 设置头文件的查找路径

target_include_directories(native-lib PRIVATE

${jni_DIR}/include)

# 3)添加一个.so依赖

add_library(avcodec SHARED IMPORTED)

set_target_properties(avcodec PROPERTIES IMPORTED_LOCATION

${jni_DIR}/lib/${ANDROID_ABI}/libavcodec.so)

add_library(avformat SHARED IMPORTED)

set_target_properties(avformat PROPERTIES IMPORTED_LOCATION

${jni_DIR}/lib/${ANDROID_ABI}/libavformat.so)

add_library(avfilter SHARED IMPORTED)

set_target_properties(avfilter PROPERTIES IMPORTED_LOCATION

${jni_DIR}/lib/${ANDROID_ABI}/libavfilter.so)

add_library(avutil SHARED IMPORTED)

set_target_properties(avutil PROPERTIES IMPORTED_LOCATION

${jni_DIR}/lib/${ANDROID_ABI}/libavutil.so)

add_library(swscale SHARED IMPORTED)

set_target_properties(swscale PROPERTIES IMPORTED_LOCATION

${jni_DIR}/lib/${ANDROID_ABI}/libswscale.so)

add_library(swresample SHARED IMPORTED)

set_target_properties(swresample PROPERTIES IMPORTED_LOCATION

${jni_DIR}/lib/${ANDROID_ABI}/libswresample.so)

# 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.

# 4) 添加到链接库

target_link_libraries( # Specifies the target library.

native-lib

avcodec

avformat

avfilter

avutil

swscale

swresample

# Links the target library to the log library

# included in the NDK.

${log-lib})

修改native-lib.cpp,获取ffmpeg的版本号

#include

#include

extern "C" {

#include "libavutil/avutil.h"

}

extern "C"

JNIEXPORT jstring JNICALL

Java_com_lv_ffmpeg_FFmpegWrapper_ffmpegVersion(JNIEnv *env, jclass clazz) {

std::string hello = "Hello from C++";

return env->NewStringUTF(av_version_info());

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值