本文記錄的是從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數組(四)》