本文記錄的是 從AVFrame到自定義實體類MediaFrame的過程
前提:假定你已經看完了 《從AVFrame到MediaFrame數組(二)》,學會了Bitmap的建立
實現從AVFrame到自定義實體類MediaFrame的過程java
直接看代碼:android
// 假定全路徑名: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; } }
JNIHelper中添加一個方法:segmentfault
public class JNIHelper { public void onReceived(MediaFrame frame){ // TODO: Java層接收到MediaFrame後,能夠開始搞事情了 } }
簡單回顧上節中的bitmap的建立並填充像素數據的過程:數組
1. jobject bitmap = ...; 2. AndroidBitmap_lockPixels()...; 3. libyuv::I420ToABGR()...;執行完畢之後,咱們已經獲得了一個帶有像素數據的bitmap(jobject類型);this
封裝MediaFrame,分爲2步:
1. 建立MediaFrame對象code
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參數,爲了更深入並直觀的感覺崩潰,你能夠這樣子調用:get
env->CallVoidMethod(obj_media_frame, cb_id, "20181014");
嘿,【JNI DETECTED ERROR IN APPLICATION: use of invalid jobject】崩潰的感受可還好?解決方案就是上面寫的那樣,NewStringUTF封裝成jstring就能夠了。string
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數組(四)》