1,app build.gradle里加上如下:(这里需要自己先创建一个CMakeLists.txt空文件,如果没有安装cmake记得先安装cmake)
        ndk {
            // Specifies the ABI configurations of your native
            // libraries Gradle should build and package with your APK.
            // Options: 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
            abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
        }
        externalNativeBuild {
            cmake {
                // explicitly build libs
                targets 'audio3aprocess'
                //添加宏
                cppFlags "-DBUILD_PUSH_ONLY1"
                cFlags "-DBUILD_PUSH_ONLY2"
                //添加常量
                arguments "-DANDROID_PLATFORM=android-18","-DBUILD_PUSH_ONLY3=false"
            }
        }

上面的内容也可以直接右击项目弹出菜单中选择第二个选择后弹出如下,然后选择已经创建的CMakeLists.txt空文件
在这里插入图片描述

同步成功后的CMakeLists.txt样子像下面的图标
在这里插入图片描述

2,在CMakeLists.txt里填上类似下面内容

动态so库如下:

cmake_minimum_required(VERSION 2.8.12)
#Enable C++11
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)

#定义CONFIG_BUILD_ANDROID,定义自己的宏,在CMakeLists.txt里使用if(${UCONFIG_BUILD_ANDROID}) ... endif();在C/C++里使用#ifdef CONFIG_BUILD_ANDROID ... #endif
add_definitions("-DCONFIG_BUILD_ANDROID")

#设置 属性名 = 属性值
set(target livedetect)
set(EMFUTUREDLIB ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../../../base/EMFutureDlib)

#添加头文件根目录,我的项目中如忘记添加编译报错echo_cancellation.h:14:10: fatal error: 'webrtc/typedefs.h' file not found
include_directories(${EMFUTUREDLIB}
     ${CMAKE_CURRENT_SOURCE_DIR})

#指定so库生成的路径
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../libs/${CMAKE_ANDROID_ARCH_ABI}/)

#引入其它cmake,没有的话可以忽略
#include(${EMFUTUREDLIB}/dlib/trunk/dlib/cmake)

#编译生成的库名称+库类型( SHARED或STATIC)+所有源文件
add_library(${target} SHARED ${EMFUTUREDLIB}/EMFutureDlib.cpp ${CMAKE_CURRENT_SOURCE_DIR}/EMLiveDetectJNI.cpp)

#添加依赖库的链接,这里最终生成liblivedetect.so
target_link_libraries(${target}
        log
        android
        dlib)


静态.a库如下:

# 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)
#SET(CMAKE_C_COMPILER /usr/bin/gcc)
ADD_DEFINITIONS(-DANDROID -DNDEBUG)

add_definitions(-DWEBRTC_POSIX)
set(CMAKE_VERBOSE_MAKEFILE on)
#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c99 -frtti -fexceptions -Wall -O2 -pipe
#    -ffast-math -fexceptions
#    -fstrict-aliasing -Werror=strict-aliasing -Wa,--noexecstack")

set(SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/webrtc)


include_directories(
        /
        ${SRC_DIR}
)

set(SOURCE_FILES
        ${SRC_DIR}/common_audio/signal_processing/randomization_functions.c
        ${SRC_DIR}/common_audio/vad/vad_filterbank.c
        ...
        ${SRC_DIR}/modules/audio_processing/utility/delay_estimator.c
        )

add_library( # Sets the name of the library.
        audio3aprocess

        # Sets the library as a shared library.
        STATIC # SHARED

        # Provides a relative path to your source file(s).
        ${SOURCE_FILES}
        )

#add_library(fdk-aac STATIC IMPORTED)

#set_target_properties(fdk-aac PROPERTIES
#        IMPORTED_LOCATION
#        ${SOURCE_DIR}/ml_vendor/lib/${ANDROID_ABI}/lib/libfdk-aac.a)

#add_library(x264 STATIC IMPORTED)

#set_target_properties(x264 PROPERTIES
#        IMPORTED_LOCATION
#        ${SOURCE_DIR}/ml_vendor/lib/${ANDROID_ABI}/lib/libx264.a)

#target_link_libraries( # Specifies the target library.
#        medialivelib
#
#        # Links the target library to the log library
#        # included in the NDK.
#        log
#        android
#        EGL
#        GLESv2
#        fdk-aac
#        x264)

set(distribution_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../distribution)

#这里是为了生成静态库文件在指定文件夹下
set_target_properties(audio3aprocess
       PROPERTIES
        ARCHIVE_OUTPUT_DIRECTORY
        "${distribution_DIR}/audio3a-process/lib/${ANDROID_ABI}")
3,Jni层代码

似如下

//
// Created by Administrator on 2021/3/12.
//
#include "jni.h"
#include "AudioProcessor.h"
#include "android/log.h"
#define JNI_AUDIO2MP3_DECL(a) Java_com_gome_xxx_media_Audio2Mp3_##a

static jfieldID s_Obj_ID;
extern "C"
{

JNIEXPORT jlong JNICALL
JNI_AUDIO2MP3_DECL(init)(JNIEnv *env, jobject thiz,
                         jstring file_path, jint channels,
                         jint sample_rate, jint sample_bits) {
    jclass clazz = env->GetObjectClass(thiz);
    s_Obj_ID = env->GetFieldID(clazz , "mNativeObject" , "J");
    const char * path = env->GetStringUTFChars(file_path , nullptr);
    __android_log_print(ANDROID_LOG_INFO , "lxs0312","JNI_AUDIO2MP3_DECL(init) start");
    AudioProcessor * audioProcessor = AudioProcessor::create(path,  channels, sample_rate,  sample_bits);
    audioProcessor->init();
// TODO: implement init()
    __android_log_print(ANDROID_LOG_INFO , "lxs0312","JNI_AUDIO2MP3_DECL(init) end");
    return (long)audioProcessor;
}
JNIEXPORT jint JNICALL
JNI_AUDIO2MP3_DECL(feed)(JNIEnv *env, jobject thiz, jbyteArray bytes, jint offset,
                                                          jint length, jlong pts , jlong nativeObject) {
    // TODO: implement feed()
    __android_log_print(ANDROID_LOG_INFO , "lxs0312","JNI_AUDIO2MP3_DECL(feed) start");
    signed char * data = env->GetByteArrayElements(bytes , nullptr);
    AudioProcessor * audioProcessor = reinterpret_cast<AudioProcessor *>(nativeObject);
    if(!audioProcessor){
        return -1;
    }
            //TODO filters:回音消除、混音

    audioProcessor->feed(data , offset , length , pts);
    env->ReleaseByteArrayElements(bytes, data, 0);
    __android_log_print(ANDROID_LOG_INFO , "lxs0312","JNI_AUDIO2MP3_DECL(feed) end");
    return 0;
}

JNIEXPORT jint JNICALL
JNI_AUDIO2MP3_DECL(feedSide)(JNIEnv *env, jobject thiz,
                                                             jbyteArray bytes, jint offset,
                                                             jint length, jlong pts,
                                                             jlong native_object) {
    // TODO: implement feedSide()
    jbyte * data = env->GetByteArrayElements(bytes , nullptr);
    AudioProcessor * audioProcessor = reinterpret_cast<AudioProcessor *>(native_object);
    if(!audioProcessor){
        env->ReleaseByteArrayElements(bytes, data, 0);
        return -1;
    }
    //TODO filters:回音消除、混音
    audioProcessor->feedSide(data , offset , length , pts);

    env->ReleaseByteArrayElements(bytes, data, 0);
    return 0;
}

JNIEXPORT void JNICALL
JNI_AUDIO2MP3_DECL(destroy)(JNIEnv *env, jobject thiz) {
    // TODO: implement destroy()
    jclass clazz = env->GetObjectClass(thiz);
    jlong objID = env->GetLongField(thiz , s_Obj_ID);
    AudioProcessor * audioProcessor = reinterpret_cast<AudioProcessor *>(objID);
    if(!audioProcessor){
        return ;
    }
    audioProcessor->destroy();
}
}

参考:
https://developer.android.com/studio/projects/configure-cmake?hl=zh-cn

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐