感谢http://tq09931.iteye.com/blog/1011895这篇文章,我稍微把里面的步骤整理一下
1、用eclipse新建一个叫做FFmpeg的android工程。
2、在工程的根目录下新建一个jni目录。在jni目录下建2个文件,一是Android.mk 二是 hello_a.c。
3、将ffmpeg源码放到工程目录jni下面。此时,jni下面的目录结构应该是这样的,一个ffmpeg文件夹,一个Android.mk文件,一个 hello_a.c文件。
4、用终端定位到工程目录bin/classes下。执行 javah com.easou.abo.ffmpeg.FFmpegActivity。
5、将libffmpeg.so文件拷贝到home/abo/android-ndk-r6b/platforms/android-8/arch-arm/usr/lib,以便后面引用。关于怎么样得到libffmpeg.so文件,可以编译ffmpeg文件得到,见点击打开链接。也可以从网上下载别人已经编译好了的文件。
6、编辑Android.mk和hello_a.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 := -lffmpeg
#设置编译出的模块名称
LOCAL_MODULE := hello_jni
#设置源文件列表
LOCAL_SRC_FILES :=hello_a.c
#执行生成共享库
include $(BUILD_SHARED_LIBRARY)
hello_a.c文件代码
#include <string.h>
#include <stdio.h>
#include <android/log.h>
#include <stdlib.h>
#include <jni.h>
#include <ffmpeg/libavcodec/avcodec.h>
//所有JNI的函数都有这个JNIEnv 和 jobject ,可以用它做很多事情(具体参考 jni.h)
jstring JNICALL Java_com_easou_abo_ffmpeg_FFmpegActivity_sayHello(JNIEnv * env, jobject thiz, jstring name){
//取参数转成我们熟悉的char*
const char* param=(*env)->GetStringUTFChars(env,name,0);
//这儿好熟悉啊
char * str=(char*)malloc(32*sizeof(char));
strcpy(str,"hellogood ");
strcat(str,param);
//释放掉param
(*env)->ReleaseStringUTFChars(env,name,param);
//返回结果
jstring ret= (*env)->NewStringUTF(env,str);
free(str);
return ret;
}
jstring JNICALL Java_com_easou_abo_ffmpeg_FFmpegActivity_stringFromJNI( JNIEnv* env,jobject thiz )
{
char str[25];
sprintf(str, "%d", avcodec_version());
return (*env)->NewStringUTF(env, str);
}
7、用终端定位到工程jni目录下。运行 ~/android-ndk-r6b/ndk-build (这个是ndk的目录,我的是放在主目录下),运行完以后,在工程目录下会有一个libs/armeabi/libhello_jni.so文件。
8、拷贝一个libffmpeg.so到libs/armeabi。
9、编辑FFmpeg工程main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
</LinearLayout>
10、编辑FFmpeg工程主Activity,FFmpegActivity
package com.easou.abo.ffmpeg;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class FFmpegActivity extends Activity {
public native String sayHello(String name);
public native String stringFromJNI();
static {
System.loadLibrary("ffmpeg");
System.loadLibrary("hello_jni");
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = (TextView) findViewById(R.id.tv);
tv.setText(stringFromJNI()+sayHello("word"));
}
}
最后整个工程目录的结构如下图
10、运行工程。