参考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
}
}
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一下。
#include <jni.h>
#include <stdio.h>
JNIEXPORT jint JNICALL Java_vplayer_test_vplayer_version//这个函数可以通过javah生成 详见前一篇文章
(JNIEnv *evn, jobject obj)
{
return (int)avcodec_version();
}