[Android開(kāi)發(fā)]初嘗AndroidStudio2.2+cmake+ndk開(kāi)發(fā)(3)——FFmpeg的HelloWorld

本例子簡(jiǎn)單的輸出FFmpeg其配置信息等

怎么編譯FFmpeg的so庫(kù),可以參考我之前的編譯過(guò)程http://www.reibang.com/p/228f38e9aa9c

項(xiàng)目的目錄:

把之前編譯好ffmpemg的頭文件放到include里疼邀,so文件按平臺(tái)文件夾放好喂江。這里只編譯了armeabi平臺(tái)的。jniLibs文件夾沒(méi)有的話自己建一個(gè)旁振,也可以在build.gradle里指定一個(gè)目錄获询。這里jniLibs的路徑是AS的默認(rèn)配置,無(wú)需修改build.gradle

Activity代碼:

public class FFmpegHelloActivity extends AppCompatActivity {

    static {
        System.loadLibrary("ffmpeg-hello");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ffmpeg_hello);
        TextView tv = (TextView) findViewById(R.id.tv_info);
        tv.setText(avcodeConfigFromJni());
    }

    public native String avcodeConfigFromJni();
}

cpp代碼:
頭文件ffmpeg.h

#include <jni.h>

extern "C"
JNIEXPORT jstring JNICALL
Java_com_clam314_hellojni_FFmpegHelloActivity_avcodeConfigFromJni(JNIEnv *env, jobject instance);

源代碼ffmpeg-hello.cpp:

#include <stdio.h>
#include "ffmpeg-hello.h"
extern "C"
{
#include <libavcodec/avcodec.h>
}

extern "C"
JNIEXPORT jstring JNICALL
Java_com_clam314_hellojni_FFmpegHelloActivity_avcodeConfigFromJni(JNIEnv *env, jobject instance) {
    char info[10000] = { 0 };
    sprintf(info, "%s\n", avcodec_configuration());
    return env->NewStringUTF(info);
}

CmakeLists.txt

# Sets the minimum version of CMake required to build the native
# library. You should either keep the default value or only pass a
# value of 3.4.0 or lower.

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 it for you.
# Gradle automatically packages shared libraries with your APK.
#設(shè)置一個(gè)路徑拐袜。
set(distribution_DIR ${CMAKE_SOURCE_DIR}/src/main/jniLibs)

add_library(
            avcodec-57
            SHARED
            IMPORTED)
set_target_properties( avcodec-57
                       PROPERTIES IMPORTED_LOCATION
                       ${distribution_DIR}/${ANDROID_ABI}/libavcodec-57.so )

add_library(
            avfilter-6
            SHARED
            IMPORTED)
set_target_properties( avfilter-6
                       PROPERTIES IMPORTED_LOCATION
                       ${distribution_DIR}/${ANDROID_ABI}/libavfilter-6.so )

add_library(
            avformat-57
            SHARED
            IMPORTED)
set_target_properties( avformat-57
                       PROPERTIES IMPORTED_LOCATION
                       ${distribution_DIR}/${ANDROID_ABI}/libavformat-57.so )

add_library(
            avutil-55
            SHARED
            IMPORTED)
set_target_properties( avutil-55
                       PROPERTIES IMPORTED_LOCATION
                       ${distribution_DIR}/${ANDROID_ABI}/libavutil-55.so )

add_library(
            swresample-2
            SHARED
            IMPORTED)
set_target_properties( swresample-2
                       PROPERTIES IMPORTED_LOCATION
                       ${distribution_DIR}/${ANDROID_ABI}/libswresample-2.so )

add_library(
            swscale-4
            SHARED
            IMPORTED)
set_target_properties( swscale-4
                       PROPERTIES IMPORTED_LOCATION
                       ${distribution_DIR}/${ANDROID_ABI}/libswscale-4.so )
add_library( avdevice-57
             SHARED
             IMPORTED)
set_target_properties( avdevice-57
                       PROPERTIES IMPORTED_LOCATION
                       ${distribution_DIR}/${ANDROID_ABI}/libavdevice-57.so )

#支持-std=gnu++11
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")

#判斷編譯器類型,如果是gcc編譯器,則在編譯選項(xiàng)中加入c++11支持
if(CMAKE_COMPILER_IS_GNUCXX)
    set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
    message(STATUS "optional:-std=c++11")
endif(CMAKE_COMPILER_IS_GNUCXX)

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 )

add_library( native-lib
             SHARED
             src/main/cpp/native-lib.cpp )


add_library( ffmpeg-hello
             SHARED
             src/main/cpp/ffmpeg-hello.cpp )

include_directories(src/main/jniLibs/include/)

target_link_libraries( native-lib avcodec-57 avfilter-6 avformat-57 avutil-55 swresample-2 swscale-4 avdevice-57
                       ${log-lib} )

target_link_libraries( ffmpeg-hello avcodec-57 avfilter-6 avformat-57 avutil-55 swresample-2 swscale-4 avdevice-57
                       ${log-lib} )

CMAKE_SOURCE_DIR 是CmakeLists.txt所在目錄吉嚣,Cmake的默認(rèn)值

將 distribution_DIR指定為jniLibs的路徑,后面用于統(tǒng)一指定so庫(kù)的路徑
set(distribution_DIR ${CMAKE_SOURCE_DIR}/src/main/jniLibs)
#添加一個(gè)so庫(kù)蹬铺,每一個(gè)都要添加尝哆,無(wú)論是自定義還是預(yù)編譯的
add_library( avdevice-57#so文件的名字
             SHARED #類型是共享庫(kù)
             IMPORTED)#預(yù)編譯的so指定為IMPORTED,自定義的eg:ffmpeg-hello的就填路徑

#每加入一個(gè)預(yù)定義的so庫(kù)都需要執(zhí)行這命令
set_target_properties( avdevice-57#so文件的名字
                       PROPERTIES IMPORTED_LOCATION
                      #so庫(kù)所在路徑甜攀,ANDROID_ABI是平臺(tái)的名字秋泄,Cmake的默認(rèn)值
                       ${distribution_DIR}/${ANDROID_ABI}/libavdevice-57.so )
指定預(yù)編譯庫(kù)的頭文件路徑,另外自定義的頭文件放cpp文件夾里就行
include_directories(src/main/jniLibs/include/)
鏈接各個(gè)so庫(kù)规阀,每一個(gè)自定義的so,都需要和其用到so鏈接一遍恒序。eg:這里的ffmpe-hello就用到了ffmpeg的so庫(kù),但沒(méi)有用到native-lib谁撼,native-lib就無(wú)須在參數(shù)里面歧胁。若沒(méi)有調(diào)用此命令,調(diào)用其他so庫(kù)的方法的地方會(huì)報(bào) error: undefined reference to 
target_link_libraries( ffmpeg-hello avcodec-57 avfilter-6 avformat-57 avutil-55 swresample-2 swscale-4 avdevice-57
                       ${log-lib} )

結(jié)果:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末厉碟,一起剝皮案震驚了整個(gè)濱河市喊巍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌箍鼓,老刑警劉巖崭参,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異袄秩,居然都是意外死亡阵翎,警方通過(guò)查閱死者的電腦和手機(jī)逢并,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門之剧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人砍聊,你說(shuō)我怎么就攤上這事背稼。” “怎么了玻蝌?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵蟹肘,是天一觀的道長(zhǎng)词疼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)帘腹,這世上最難降的妖魔是什么贰盗? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮阳欲,結(jié)果婚禮上舵盈,老公的妹妹穿的比我還像新娘。我一直安慰自己球化,他們只是感情好秽晚,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著筒愚,像睡著了一般赴蝇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上巢掺,一...
    開(kāi)封第一講書(shū)人閱讀 52,246評(píng)論 1 308
  • 那天句伶,我揣著相機(jī)與錄音,去河邊找鬼陆淀。 笑死熄阻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的倔约。 我是一名探鬼主播秃殉,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼浸剩!你這毒婦竟也來(lái)了钾军?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤绢要,失蹤者是張志新(化名)和其女友劉穎吏恭,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體重罪,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡樱哼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了剿配。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搅幅。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖呼胚,靈堂內(nèi)的尸體忽然破棺而出茄唐,到底是詐尸還是另有隱情,我是刑警寧澤蝇更,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布沪编,位于F島的核電站呼盆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蚁廓。R本人自食惡果不足惜访圃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望相嵌。 院中可真熱鬧挽荠,春花似錦、人聲如沸平绩。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)捏雌。三九已至跃赚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間性湿,已是汗流浹背纬傲。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肤频,地道東北人叹括。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像宵荒,于是被迫代替她去往敵國(guó)和親汁雷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容