參考http://www.cnblogs.com/jrvin/archive/2011/04/25/2027368.html
1.首先是要用android NDK編譯好ffmpeg 產生5M左右的連結庫(參考前一篇文章),並放在對應現使用平台目錄下,如C:\android-ndk-r6\platforms\android-9\arch-arm\usr\lib
2.建立一個android程式,api要和上面對應,如andorid-9 建立jni檔案夾,進入,把之前編譯好的ffmpeg代碼放進去重名為ffmpeg檔案夾。並在jni建立Android.mk檔案,和ffmpegtest.c檔案,內容如下:
3.然後使用nkd命令編譯:
./ndk-build -C /home/s_jrvin/workspace/jnitest
在工程根目錄下的Libs\armeabi\下產生了libjnitest.so。成功。。呵呵。。
然後把libffmpeg.so 拷到工程根目錄下的Libs\armeabi\下。
運行 android程式,成功列印log資訊。
主程式.java
package vplayer.test;import android.app.Activity;import android.os.Bundle;import android.util.Log;public class vplayer extends Activity {public native int version(); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); int x = version(); Log.d("version", String.valueOf(x)); } static { System.loadLibrary("ffmpeg");//調用之前編譯好的ffmpeg的so System.loadLibrary("jnitest");//調用之後用ndk編譯好的libjnitest.so }}
Android.mk:
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := jnitest//so名字LOCAL_SRC_FILES := ffmpegtest.c//要用到的.c檔案LOCAL_C_INCLUDES += $(LOCAL_PATH)/ffmpeg/ $(LOCAL_PATH)/ffmpeg/libavutil/ $(LOCAL_PATH)/ffmpeg/libavcodec/ $(LOCAL_PATH)/ffmpeg/libavformat/ $(LOCAL_PATH)/ffmpeg/libavcodec/ $(LOCAL_PATH)/ffmpeg/libswscale/LOCAL_LDLIBS +=-lffmpeginclude $(BUILD_SHARED_LIBRARY)
PATH_TO_FFMPEG_SOURCE:=$(LOCAL_PATH)/ffmpeg
這行是定義一個變數,也就是ffmpeg源碼的路徑
LOCAL_C_INCLUDES += $(PATH_TO_FFMPEG_SOURCE)
這行是指定原始碼的路徑,也就是剛才拷過去的ffmpeg源碼,$(LOCAL_PATH)是根目錄,如果沒有加這行那麼引入ffmpeg庫中的h檔案編譯就會出錯說找不到該h檔案。
LOCAL_LDLIBS := -lffmpeg
這行很重要,這是表示你這個so啟動並執行時候依賴於libffmpeg.so這個庫, 再舉個例子:如果你要編譯的so不僅要用到libffmpeg.so這個庫還要用的libopencv.so這個庫的話,你這個參數就應該寫成
LOCAL_LDLIBS := -lffmpeg -lopencv
其他的參數都是正常的ndk編譯用的了,不明白的話google一下。
ffmpegtest.c
#include <jni.h>#include <stdio.h>JNIEXPORT jint JNICALL Java_vplayer_test_vplayer_version//這個函數可以通過javah產生 詳見前一篇文章 (JNIEnv *evn, jobject obj){return (int)avcodec_version();}