第20课 在Android Native开发中加入新的C++类

​这节课我们开始利用ffmpeg和opencv在Android环境下来实现一个rtmp播放器,与第2课在PC端实现播放器的思路类似,只不过在处理音视频显示和播放的细节略有不同。

1.压缩备份上节课工程文件夹并修改工程文件夹为demo20,将demo20导入到Eclipse或者在原工程上继续下列的开发步骤。

2.右单击工程目录下的jni节点并添加一个新的C++类fmlp,如下图所示:

3.删除工程中的其它按钮,并添加id为startBtn的按钮:

java 复制代码
<Button

        android:id="@+id/startBtn"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_alignParentBottom="true"

        android:layout_centerHorizontal="true"

        android:onClick="start"

        android:text="Start"

     />

在MainActivity.java中添加以下代码:

java 复制代码
Button startBtn;

startBtn=(Button)findViewById(R.id.startBtn);                

public native String startFF(String rtmpURL);

public native String stopFF();

4.绑定单击事件start用于启动C++中的FFmpeg线程:

java 复制代码
public void start(View view){ 

backWidth = Integer.toString(320);

          backHeight=Integer.toString(240);

rtmpURL = "rtmp://192.168.0.100/vod/2.mp4";

msgTxt.setText(startFF(rtmpURL));                

} 

5.在jni目录下添加fmlp类:

fmlp.h内容如下:

cpp 复制代码
class fmlp {

public:

fmlp();

virtual ~fmlp();

string init();

};

fmlp.cpp内容如下:

cpp 复制代码
std::stringfmlp::init() {

    return"Hello fmlp...";

}

6.在demo.cpp中添加启动FFmpeg的代码:

cpp 复制代码
JNIEXPORT jstring JNICALL Java_com_example_demo_MainActivity_startFF(JNIEnv *env, jobject obj) {

if(myFmlp==NULL){

          myFmlp =new fmlp();

}

std::string str=myFmlp->init();

return env->NewStringUTF(str.c_str());

}

7.在Android.mk中添加fmlp编译选项以使fmlp.cpp被编译,完整的Android.mk内容如下

bash 复制代码
LOCAL_PATH := $(call my-dir)

#ffmpeg lib

include$(CLEAR_VARS)

LOCAL_MODULE := avcodec

LOCAL_SRC_FILES := lib/libavcodec.so

include$(PREBUILT_SHARED_LIBRARY)



include$(CLEAR_VARS)

LOCAL_MODULE := avdevice

LOCAL_SRC_FILES := lib/libavdevice.so

include$(PREBUILT_SHARED_LIBRARY)



include$(CLEAR_VARS)

LOCAL_MODULE := avfilter

LOCAL_SRC_FILES := lib/libavfilter.so

include$(PREBUILT_SHARED_LIBRARY)



include$(CLEAR_VARS)

LOCAL_MODULE := avformat

LOCAL_SRC_FILES := lib/libavformat.so

include$(PREBUILT_SHARED_LIBRARY)



include$(CLEAR_VARS)

LOCAL_MODULE := avutil

LOCAL_SRC_FILES := lib/libavutil.so

include$(PREBUILT_SHARED_LIBRARY)





include$(CLEAR_VARS)

LOCAL_MODULE := postproc

LOCAL_SRC_FILES := lib/libpostproc.so

include$(PREBUILT_SHARED_LIBRARY)



include$(CLEAR_VARS)

LOCAL_MODULE := swresample

LOCAL_SRC_FILES := lib/libswresample.so

include$(PREBUILT_SHARED_LIBRARY)



include$(CLEAR_VARS)

LOCAL_MODULE := swscale

LOCAL_SRC_FILES := lib/libswscale.so

include$(PREBUILT_SHARED_LIBRARY)



#x264 lib

include$(CLEAR_VARS)

LOCAL_MODULE := libx264

LOCAL_SRC_FILES := lib/libx264.161.so

include$(PREBUILT_SHARED_LIBRARY)



#opencv lib

include$(CLEAR_VARS)

LOCAL_MODULE := opencv

LOCAL_SRC_FILES :=lib/libopencv_java3.so

include$(PREBUILT_SHARED_LIBRARY)



#demo

include$(CLEAR_VARS)

LOCAL_MODULE    := demo

LOCAL_SRC_FILES := fmlp.cpp demo.cpp



LOCAL_C_INCLUDES += $(LOCAL_PATH)/include

##-landroid参数 for native windows

LOCAL_LDLIBS := -llog -landroid

#LOCAL_LDLIBS := -llog -lz

LOCAL_SHARED_LIBRARIES :=opencv libx264 avcodec avdevice avfilter avformat avutil postproc swresample swscale



include$(BUILD_SHARED_LIBRARY)

调试运行,能正确返回信息"Hello ++fmlp++..."则表示程序运行正常。

相关推荐
玖玥拾34 分钟前
C/C++ 基础笔记(十三)继承
c语言·c++·继承
z落落1 小时前
C#WinForm 窗体切换与窗体传值(登录跳转案例)+WinForm 窗体传值(从上往下传、从下往上传)
开发语言·windows·c#
2601_961765291 小时前
【分享】PlayerPro媒体音乐播放器 完整专业版
android·媒体
allway21 小时前
How to Echo Multiline to a File in Bash [3 Methods]
开发语言·chrome·bash
weixin_462446231 小时前
手把手教你用 Bash 脚本自动更新 /etc/hosts —— 自动绑定网卡 IP 与节点名
开发语言·tcp/ip·bash
一个梦醒了1 小时前
安装git bash选项推荐
开发语言·git·bash
ct9781 小时前
React 状态管理方案深度对比
开发语言·前端·react
ao-weilai2 小时前
C++:哈希表
c++·哈希算法·散列表
数量技术宅2 小时前
2026量化前沿:从Reddit热帖到Python实战,如何用赫斯特指数(Hurst)狙击虚假突破?
开发语言·python
汉克老师2 小时前
GESP7级C++考试语法知识(二、指数函数(1、pow() 函数)
c++·指数函数·pow·gesp7级·精度误差