移植ffmpeg庫到Android後的簡單使用

前言

這兩天折騰ffmpeg庫的移植,好不容易成功生成libffmpeg.so, 準備驗證此庫是否可正常使用。 so庫在android下的使用一般要通過jni調用來實現,可是我們哪裡知道libffmpeg.so的jni native接口是怎麼樣的。 顯然直接調用libffmpeg.so看此來是比較麻煩的,所以就想能不能像在linux下面直接簡單的一個hello.c文件裡面有個main主函數,函數裡面有個avcodec_version(),用printf把avcodec_version()的值打印出來。就這樣一個簡單的小程序(hello),讓它在Android下面跑(adb
shell中./hello),我再看看是否可以正常輸出。如果可以,意味著生成的libffmpeg.so在某種程度上是可用的。

廢話不說瞭,直接開始。

環境

編譯環境: Ubuntu 11.04 desktop 32bit

Android NDK :android-ndk-r6-crystax-2-linux-x86

FFMPEG : 1.2.1

Android Emulator: 4.0.3

我們的目標,創建一個如上所述的hello小程序。因為是要在Android跑的,自然要用上Android NDK。

先來看看要用上的文件:

創建一個文件夾hello,裡面再創建一個jni文件夾,jni文件夾裡面內容如上圖: ffmpeg(ffmpeg源碼)、Android.mk及hello.c 。

Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
PATH_TO_FFMPEG_SOURCE:=$(LOCAL_PATH)/ffmpeg
LOCAL_C_INCLUDES += $(PATH_TO_FFMPEG_SOURCE)
LOCAL_LDLIBS := -L/home/minz/ffmpeg-1.2.1-transplant-singledynamic -lffmpeg
LOCAL_MODULE    := hello
LOCAL_SRC_FILES := hello.c
  
include $(BUILD_EXECUTABLE)

其中libffmpeg.so放在 /home/minz/ffmpeg-1.2.1-transplant-singledynamic 目錄下,根據實際情況請自行修改

hello.c:

#include 
#include "ffmpeg/libavcodec/avcodec.h"

int main() {
    char str[50];  
    sprintf(str, "%d", avcodec_version());
    printf("avcodec_version(): %s\n", str);

    return 0;
}

基本東西準備完畢。

終端下定位到hello目錄中輸入

# ~/android-ndk-r6-crystax-2/ndk-build

編譯生成成功,到hello/libs/armeabi/下找到hello就是你要的東西。

直接試試 ./hello , 你會發現返回: bash: ./hello: cannot execute binary file 。 不要忘瞭這個東西是要的android上跑的,自然不能在這邊跑瞭。

下面就是在android下面跑hello瞭。

PS: 我的Ubuntu是裝在虛擬機的, 所以剛才生成的 hello 和 編譯好的libffmpeg.so 我先拷貝出來到Windows上瞭。

先運行模擬器, cmd進入android sdk相應位置, adb shell , 返回 # 說明你目前是root權限。

然後,怎麼運行呢?也許你會說隨便把hello文件放進/sdcard某個位置,再./hello 。 但事實上/sdcard上是沒有執行權限的,所以我們可以這樣做。

把 hello 放進 /data/local/tmp , 因為這個目錄下通過shell會有執行權限,即 adb push e:\hello /data/local/tmp/hello

然後

adb shell

# cd /data/loca/tmp

# ./hello

你會發現得到一個錯誤

./hello
link_image[1936]: 2641 could not load needed library ‘libffmpeg.so’ for ‘./hell
o’ (load_library[1091]: Library ‘libffmpeg.so’ not found)CANNOT LINK EXECUTABLE

那是因為我們libffmpeg.so還沒有放進去。 libffmpeg.so需要放入/system/lib後,hello才可執行。可是,默認情況下,/system下是沒有寫權限,所以你直接 adb push e:\libffmpeg.so /system/lib/libffmpeg.so是不可行的, 需要重新掛載 /system才可以。 先來看看當前模擬中掛載的情況,

# mount

看到沒有, 我們的/system 是ro , 隻有讀的權限。 而sdcard是沒有執行權限的。

所以我們來重新掛載設備,# mount -o remount,rw -t yaffs2 /dev/block/mtdblock0 /system

再用mount看下可以發現/system現在是rw瞭, 即可讀可寫。 接著把我們的libffmpeg.so拷貝進去 adb push e:\libffmpeg.so /system/lib/libffmpeg.so

 回到/data/local/tmp目錄下, ./hello 看看結果 :

成功返回。 3563596是我們ffmpeg版本對應的整數 。

轉載請註明出處: https://blog.csdn.net/oathevil/article/details/17043191

發佈留言