android中如何使用编译好的libffmpeg.so

感谢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、运行工程。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值