在上节课,根据模板文件我们对在Android环境中使用FFmpeg和openCV进行开发有了一个初步的体验,这节课,我们来具体看一下其工作流程。
1.程序的入口
与VS2013程序开发类似,Android程序开发也有一个入口,在这个模板中,它的入口文件是MainActivity.java,具体路径是:E:\jPro\demo\src\com\example\demo\MainActivity.java。我们打开MainActivity.java,会看到项目的主类:public class MainActivity extends Activity {},这个就是程序的入口了,与VS2013开发类似,在这个类中我们可以定义各种变量,也可以定义各种方法。其中的onCreate()函数类似于MFC中的OnInitDialog()函数,会在界面初始化完成后执行。
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);formatBtn=(Button)findViewById(R.id.formatBtn); codecBtn=(Button)findViewById(R.id.codecBtn); filterBtn=(Button)findViewById(R.id.filterBtn); configBtn=(Button)findViewById(R.id.configBtn);msgTxt=(TextView)findViewById(R.id.msgTxt);msgTxt.setMovementMethod(ScrollingMovementMethod.getInstance()); }
2.为了能使用FFmpeg和openCV的相关功能,我们需要先把.so动态链接库加载进来并定义四个与C++有关的native函数,这四个函数在demo.cpp中实现并被java调用。
static { System.loadLibrary("opencv_java3");System.loadLibrary("x264.161");System.loadLibrary("avcodec");System.loadLibrary("avdevice");System.loadLibrary("avfilter");System.loadLibrary("avformat");System.loadLibrary("avutil");System.loadLibrary("postproc");System.loadLibrary("swresample");System.loadLibrary("swscale");System.loadLibrary("demo");}public native String avformatinfo(); public native String avcodecinfo(); public native String avfilterinfo(); public native String configurationinfo();
3.通过按钮调用相关函数
双击打开布局文件,路径为:/demo/res/layout/activity_main.xml。
双击其中的config按钮会看到configBtn单击时会触发名为Config的java方法
<Buttonandroid:id="@+id/configBtn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignBaseline="@+id/filterBtn"android:layout_alignBottom="@+id/filterBtn"android:layout_alignRight="@+id/formatBtn"android:onClick="config"android:text="Config" />/>
而名为Config的java方法则位于MainActivity.java中,而且调用了一个名为configurationinfo()的C++ native函数。
public void config(View view){ msgTxt.setText(configurationinfo());
}
4.demo.cpp中的configurationinfo()函数则是通过下面这种方式被java调用执行的。
JNIEXPORT jstring JNICALL Java_com_example_demo_MainActivity_configurationinfo(JNIEnv *env, jobject obj) {char info[10000] = { 0 };//av_register_all();sprintf(info, "%s\n", avcodec_configuration());//printf("%s", info);return env->NewStringUTF(info);
}