android使用ffmpeg的实例程序

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

[java]  view plain copy
  1. <span style="font-size:18px;">package vplayer.test;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.util.Log;  
  6.   
  7. public class vplayer extends Activity {  
  8.     public native int version();  
  9.     /** Called when the activity is first created. */  
  10.     @Override  
  11.     public void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.main);  
  14.           
  15.         int x = version();  
  16.         Log.d("version", String.valueOf(x));  
  17.     }  
  18.       
  19.     static  
  20.     {  
  21.         System.loadLibrary("ffmpeg");//调用之前编译好的ffmpeg的so  
  22.         System.loadLibrary("jnitest");//调用之后用ndk编译好的<span style="font-size: 18px; ">libjnitest.so</span>  
  23.     }  
  24. }</span>  


Android.mk:

[cpp]  view plain copy
  1. <span style="font-size:18px;">LOCAL_PATH := $(call my-dir)  
  2. include $(CLEAR_VARS)  
  3.   
  4. LOCAL_MODULE    := jnitest//so名字  
  5. LOCAL_SRC_FILES := ffmpegtest.c//要用到的.c文件  
  6. 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/  
  7. LOCAL_LDLIBS +=-lffmpeg  
  8. include $(BUILD_SHARED_LIBRARY)</span>  


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

[cpp]  view plain copy
  1. <span style="font-size:18px;">#include <jni.h>  
  2. #include <stdio.h>  
  3.   
  4. JNIEXPORT jint JNICALL Java_vplayer_test_vplayer_version//这个函数可以通过javah生成 详见前一篇文章  
  5.   (JNIEnv *evn, jobject obj)  
  6. {  
  7.     return (int)avcodec_version();  
  8. }</span> 

你可能感兴趣的:(android使用ffmpeg的实例程序)