首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Eclipse开发 >

Ubuntu停,在Eclipse中使用JNI调用ffmpeg

2013-10-08 
Ubuntu下,在Eclipse中使用JNI调用ffmpegAndroid的应用层开发大部分还是采用JAVA,如果想使用ffmpeg库,就必

Ubuntu下,在Eclipse中使用JNI调用ffmpeg

Android的应用层开发大部分还是采用JAVA,如果想使用ffmpeg库,就必须利用JNI,使得Java可以调用C/C++的库。

JNI其实就是定义的一个转接接口,可以让Java的代码调用C/C++的库,我的理解有点像C#中调用C/C++的DLL需要一个proxy工程一样。编译好的ffmpeg库文件名为:libffmpeg.so,它是一个普通的C/C++动态链接库。下面以libffmpeg.lib为例子,讲述在Android开发中,如果使用JNI调用C/C++的库。

1,准备工作

     在做JNI开发之前,需要安装配置Android NDK,并且将ffmpeg编译成动态链接库libffmpeg.so。这个步骤在网上有很多资料,在此不再重复。我们假定NDK已经配置好、文件libffmpeg.so已经得到,下面的步骤都是基于这个条件来实现的。

2,新建Android Project

     启动Eclipse,创建一个默认类型的Android Project,设置Application Name为mplayer,如下图:

Ubuntu停,在Eclipse中使用JNI调用ffmpeg   

3,定义JNI接口

     为工程添加JNI接口函数,这些函数就是需要用C/C++来实现的功能。我们可以选在左侧的Package Explorer中选中src目录,然后通过右键菜单:New->Class打开新建类的对话框。然后在Package栏输入“com.example.jni”;在Name栏输入“JNI”。如下图:

Ubuntu停,在Eclipse中使用JNI调用ffmpeg

     然后点击确定,在工程里就添加好了接口定义文件JNI.java。如下图:

Ubuntu停,在Eclipse中使用JNI调用ffmpeg  

     编辑文件JNI.java,在该文件中定义需要JNI实现的函数接口,如下:


      回车确定之后,将在目录./mplayer/bin/classes/下生成一个C/C++的头文件:com_example_jni_JNI.h。这个头文件时间上是之前我们定的JNI接口函数的C/C++表示形式,其函数名是根据JNI的规则自动生成的,我们不要去修改。文件内容如下:


   编译成功的话会在目录./mplayer/libs/armeabi/ 下生成库文件:libffmpeg_jni.so。将最开始准备的libffmpeg.so这个文件也拷贝到这个目录下,因为这两个文件有依赖关系,最终都要打包到pak里的。

6,Java中调用so库

   现在到了最后一步,所有的准备工作都做好了,就等Java代码里使用so库了。

   a.先在Java代码里加载so库,在文件MainActivity.java中加入如下代码:

package com.example.mplayer;import com.example.jni.JNI;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.widget.TextView;public class MainActivity extends Activity {JNI ffmpegJNI;static {System.loadLibrary("ffmpeg_jni");System.loadLibrary("ffmpeg");}    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                TextView tv = (TextView)findViewById(R.id.tv);        TextView tv2 = (TextView)findViewById(R.id.tv2);        ffmpegJNI = new JNI();        if (ffmpegJNI.ffmpegInit())        {        tv.setText("FFmpeg is initliazed!");        tv2.setText(String.valueOf("avcodec verison:" + ffmpegJNI.ffmpegGetavcodecversion()));        }    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.main, menu);        return true;    }@Overrideprotected void onDestroy() {ffmpegJNI.ffmpegUninit();super.onDestroy();}    }

热点排行