從AVFrame到MediaFrame數組(三)

本文記錄的是從AVFrame到自定義實體類MediaFrame的過程

目的

前提:假定你已經看完了《從AVFrame到MediaFrame數組(二)》

實現從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數組(四)》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章