【Android音视频开发】从AVFrame到MediaFrame数组(三)
本文记录的是从AVFrame到自定义实体类MediaFrame的过程
目的
前提:假定你已经看完了《从AVFrame到MediaFrame数组(二)》,学会了Bitmap的创建实现从AVFrame到自定义实体类MediaFrame的过程
Java层创建MediaFrame实体类
直接看代码:
// 假定全路径名:me.oogh.xplayer.MediaFrame,后面FindClass时会用到这个全路径 public class MediaFrame { private String id; private Bitmap bitmap; public void setId(String id) { this.id = id; } public String getId() { return id; } public void setBitmap(Bitmap bitmap) { this.bitmap = bitmap; } public Bitmap getBitmap() { return bitmap; } }
修改Java层回调接口
JNIHelper中添加一个方法:
public class JNIHelper { public void onReceived(MediaFrame frame){ // TODO: Java层接收到MediaFrame后,可以开始搞事情了 } }
Native层封装MediaFrame
简单回顾上节中的bitmap的创建并填充像素数据的过程:
1. jobject bitmap = ...; 2. AndroidBitmap_lockPixels()...; 3. libyuv::I420ToABGR()...;
执行完毕以后,我们已经得到了一个带有像素数据的bitmap(jobject类型);
封装MediaFrame,分为2步:
1. 创建MediaFrame对象
jclass clz_media_frame = env->FindClass("me/oogh/xplayer/MediaFrame"); jmethodID cb_constructor = env->GetMethodID(clz_media_frame, "<init>", "()V"); jobject obj_media_frame = env->NewObject(clz_media_frame, cb_constructor);
根据全路径找到MediaFrame.class,再根据方法签名找到它的构造方法,调用NewObject执行它的构造方法,得到MediaFrame对象实例。
2. 设置MediaFrame属性(id, bitmap)
// TODO: 设置id属性 jstring id = env->NewStringUTF("20181014"); jmethodID cb_id = env->GetMethodID(clz_media_frame, "setId", "(Ljava/lang/String;)V"); env->CallVoidMethod(obj_media_frame, cb_id, id); // TODO: 设置bitmap属性 jmethodID cb_bitmap = env->GetMethodID(clz_media_frame, "setBitmap", "(Landroid/graphics/Bitmap;)V"); env->CallVoidMethod(obj_media_frame, cb_bitmap, bitmap);
【注意】设置id属性时有一个坑,就是那个CallVoidMethodd中的id参数,为了更深刻并直观的感受崩溃,你可以这样子调用:
env->CallVoidMethod(obj_media_frame, cb_id, "20181014");
嘿,【JNI DETECTED ERROR IN APPLICATION: use of invalid jobject】崩溃的感觉可还好?解决方案就是上面写的那样,NewStringUTF封装成jstring就可以了。
Native回调Java接口
jclass clz_jni_helper = env->FindClass("me/oogh/xplayer/JNIHelper"); jmethodID cb_received = env->GetMethodID(clz_jni_helper, "onReceived", "(Lme/oogh/xplayer/MediaFrame;)V"); env->CallVoidMethod(obj, cb_received, obj_media_frame);
至此,从AVFrame到MediaFrame,再将MediaFrame上传,就已经结束了。
链接到下一文:《从AVFrame到MediaFrame数组(四)》
相关推荐
博了个客 2020-05-31
lixiaotao 2020-03-05
songfens 2020-01-10
MIKUScallion 2020-01-10
调调 2013-07-24
83580494 2013-06-29
TongsengsBlog 2013-08-27
Android进阶 2013-08-25
89143951 2011-08-25
八角塘塘主 2019-10-29
lerayZhang 2015-01-11
timewind 2019-07-01
Ashes 2019-06-30
PGzxc 2019-06-28
xusong 2012-08-01
Android进阶 2019-06-27
helowken 2019-06-21
飞奔的熊猫 2019-06-21
solarsaber 2015-07-24