日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

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

發布時間:2024/1/23 Android 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android studio 加载ffmpeg.so,Android studio使用已经编译好的ffmpeg .so库 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一. 從C++返回hello world

這一步是android studio自帶功能

新建工程時選擇native c++即可

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文件到工程

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());

}

總結

以上是生活随笔為你收集整理的android studio 加载ffmpeg.so,Android studio使用已经编译好的ffmpeg .so库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。