android studio cmake調用ffmpeg庫

android studio現在引入cmake可以很好地實現ndk的編寫。現在我們就使用這種方式實現ffmpeg庫的調用

1. ffmpeg編譯

    此部分可以參考我們之前的文章Compile ffmpeg for Android,因此不加贅述

2. 修改CMakeLists.txt

 add_library(avcodec-55
            SHARED
            IMPORTED)
  set_target_properties(avcodec-55
                      PROPERTIES IMPORTED_LOCATION
                      ../../../../libs/x86_64/libavcodec-55.so)


  target_link_libraries( # Specifies the target library.
                       native-lib


                       # Links the target library to the log library
                       # included in the NDK.
                       avcodec-55
                       ${log-lib} )

  //注意set_target_properties設置的路徑是相對於cpp文件的路徑

   這樣我們的native-lib.cpp就可以調用ffmpeg的庫函數了

3. 增加include文件

include_directories(src/main/cpp/include)

如果沒有這句話,就不能調用ffmpeg的頭文件

        //注意include_directories的路徑是相對於cMakeLists.txt的路徑。

4. link error:wrong file format

如果我們只有x86_64平臺的ffmpeg庫文件,而平時我們生成apk文件都是全平臺的。所以mips等平臺link就會出現wrong file format。

解決問題的方法:

  添加平臺過濾。

defaultConfig{
...
externalNativeBuild {
            cmake {
                abiFilters "x86_64"
                cppFlags ""
            }
        }
}

5.undefined reference to "avcodec_register_all"

我們已經在cmakeLists.txt中添加了頭文件,以及庫文件鏈接,但是還是找不到函數定義。

這是因爲我們頭文件引用時出現問題,因爲ffmpeg的頭文件是c頭文件

extern "C"{

#include "libavcodec/avcodec.h"
}


6. java如何調用庫文件

上面我們主要講cpp調用庫文件,此時我們需要將java如何調用

第一步,將so文件打包到apk文件中

sourceSets{
            main{
                jniLibs.srcDirs = ['libs']
//               jniLibs.srcDirs = ['src/main/jniLibs'] #將so放到src/main/jniLibs
            }
        }

同時我們需要將so文件拷貝到libs文件夾下

第二步,在java文件中直接調用

System.loadLibrary("avcodec-55");


參考文章:http://lib.csdn.net/article/liveplay/49953?knId=1586

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章