美文网首页
NDK使用之引用.so开源库

NDK使用之引用.so开源库

作者: arvinljw | 来源:发表于2021-02-18 18:27 被阅读0次

    上一篇中总结了直接引用c/c++源码,但是当源码的量很大时,我们无法直接引用源码,因为量太大了,编译一次需要很长的时间,所以这时候我们就需要先预编译出.so包或者.a包,然后再引用,这时候编译就非常快了。

    上一篇中已经介绍了如何将项目配置为ndk项目,这篇就不再赘述了,下面就以FFMPeg为例,直接进入正题。

    编译FFMPeg

    这也不是本文的重点,我在之前的文章中也整理过如何编译FFMPeg,其实也整理过如何集成FFMPeg,但是本篇的方式更加简单直接一点。

    添加so包

    这里我编译出来的是armeabi-v7a架构下的so包,所以把编译好的so包放入到lib/armeabi-v7a目录下,然后在该module的build.gradle文件的android->defaultConfig下边添加:

    externalNativeBuild {
        cmake {
            cppFlags ""
            abiFilters "armeabi-v7a"
        }
    }
    
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
    

    然后再在CMakeLists文件下,添加

    set(FF ${CMAKE_SOURCE_DIR}/../../../libs/${ANDROID_ABI})
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${FF}")
    
    • 第一句的意思是把lib/armeabi-v7a下的文件列表赋值给变量FF
    • 第二句的意思添加动态链接库到cxx_flags上,编译时编译器就能找到该目录

    注意:因为在上文配置的abiFilters只有armeabi-v7a,所以FF变量就是lib/armeabi-v7a下的文件列表

    添加头文件

    把编译得到的include文件整个文件夹拷贝到cpp目录下,然后使用

    include_directories(include)
    

    就能直接把头文件引用进来了

    添加一个库

    例如这里添加一个叫player_util的库,包含了cpp下所有的c++源码:

    file(GLOB SOURCES *.cpp)
    
    add_library(
            player_util
            SHARED
            ${SOURCES})
    

    将FFMPeg库链接到player_util上

    最后还需要把之前添加进来的so库连接到我们创建的这个player_util库上,这样我们才能引用到,代码如下:

    target_link_libraries(player_util
            avformat avcodec avutil swresample swscale
            log z OpenSLES android)
    

    注意第二行FFMPeg这几个库的顺序,因为前边的引用了后边的库,所以需要把引用的库按照这个顺序连接进来才行,第三行的事Android内部的so库,因为要视频的解码和渲染的话就需要用到。

    至此引用so库的方式也介绍完了。

    相关文章

      网友评论

          本文标题:NDK使用之引用.so开源库

          本文链接:https://www.haomeiwen.com/subject/gysnxltx.html