android使用ffmpeg的实例程序

参考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 +=-lffmpeg
include $(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();
}

你可能感兴趣的:(android,jni,Module,Path,include,library)