第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++..."则表示程序运行正常。

相关推荐
felixking23 分钟前
C++20 协程
开发语言·c++·协程
Zane1994122 小时前
CAS 与原子类:Java 如何实现无锁编程
java·开发语言
码农颜3 小时前
6.3 主函数流程剖析
开发语言·php
FinelyYang3 小时前
UniApp + LiveKit:Android 端为什么要用原生做屏幕共享,以及我们怎么落地的
android·uni-app
蓝速科技3 小时前
蓝速科技信创落地:平衡安全合规与项目成本的实战方案
android·运维·人工智能·科技·安全·电脑·鸿蒙
TheBestRucy3 小时前
Python 九阳神功:从零筑基到线程飞升
服务器·开发语言·网络·人工智能·python
研☆香3 小时前
聊一聊前端的常见字 关键字
开发语言·前端·javascript
小小龙学IT3 小时前
FlatBuffers 深度解析:Google 开源零拷贝序列化库完全指南
c++·开源
wuminyu4 小时前
JDK21中虚拟线程和FFM协同实现高并发源码剖析
java·linux·c语言·jvm·c++
草莓橙子碗4 小时前
Claude 使用指南
开发语言·python