首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

H.264 解碼器移植到 OPhone 平台實戰記錄

     編輯:Java 相關知識

移植目標

將既有的 H.264 解碼庫(C/C++ 實現)移植至 OPhone 作業系統(NDK + C 環境),並編寫 Java 測試程式(OPhone SDK)驗證解碼功能。解碼器曾優化至 Nokia 6600(120MHz CPU)可流暢播放,效能有保障。

開發環境與前置條件

  • 熟悉 Java/C/C++、JNI 技術、跨平台移植經驗。
  • 具備可移植的 H.264 解碼庫原始碼(僅公開頭文件)。
  • OPhone SDK、NDK、Cygwin 編譯環境。

移植流程概覽

  1. 封裝 Java Native Interface (JNI) 層。
  2. 使用 javah 生成 JNI 頭文件。
  3. 以 C/C++ 實現 Native 方法,處理 ByteBuffer 與指針轉換。
  4. 編寫 Android.mk,使用 NDK 工具鏈編譯生成 libH264Decode.so。
  5. 開發 Java 測試程式,驗證解碼並顯示畫面(RGB 轉 BMP)。
  6. 將 .so 與測試視頻推送至模擬器 /system/lib 與 /tmp,整合測試。

關鍵技術細節

1. JNI 介面設計

Java 層 H264decode 類封裝三個 native 方法:

private native static long Initialize();
private native static int DecodeOneFrame(long decodePtr, ByteBuffer in, ByteBuffer out);
private native static void Destroy(long decodePtr);

使用 long 儲存 C++ 物件指針,ByteBuffer 傳遞輸入/輸出資料。

2. Native 實現要點

  • 透過 GetObjectClass、GetMethodID 取得 ByteBuffer 的 position、remaining、array 等屬性。
  • 使用 GetByteArrayElements 獲取直接記憶體指針,避免資料拷貝。
  • 解碼完成後更新 ByteBuffer 的 position,並釋放陣列元素。
// 核心解碼邏輯片段
H264Decode *pDecode = (H264Decode *)decode;
unsigned char *In = (unsigned char*)InJbyte + InPosition;
unsigned char *Out = (unsigned char*)OutJbyte;
DecodeSize = pDecode->DecodeOneFrame(In, InRemaining, Out, OutSize);
// 更新 Buffer position ...
env->ReleaseByteArrayElements(InByteArrary, InJbyte, 0);
env->ReleaseByteArrayElements(OutByteArrary, OutJbyte, 0);

3. NDK 編譯配置

在 $NDK/apps/H264Decode/Android.mk 定義模組:

APP_PROJECT_PATH := $(call my-dir)
APP_MODULES := H264Decode

在 $NDK/sources/H264Decode/Android.mk 列出所有源文件:

LOCAL_SRC_FILES := common.c cabac.c utils.c golomb.c mpegvideo.c \
                     mem.c imgconvert.c h264decode.cpp h264.c dsputil.c \
                     ophone_streaming_video_h264_H264decode.cpp
include $(BUILD_SHARED_LIBRARY)

啟動 Cygwin 執行 make,出現 Install: 即編譯成功。

4. 常見問題與對策

  • typedef 重複定義:註解掉代碼中的 typedef signed char int8_t;,因 NDK 已內建。
  • 模擬器黑屏:等待模擬器完全啟動,或升級模擬器版本。
  • 檔案推送:需 adb remount 後才能寫入 /system/lib。

測試驗證

Eclipse 執行 OPhone 專案,載入 Demo.264 視頻流,解碼後透過自製 BMPImage 工具類將 RGB 資料轉為 BMP 顯示於 ImageView,並計算 FPS。截圖顯示解碼畫面正常輸出。

總結

本文完整記錄了從 JNI 封裝、Native 實現、NDK 編譯到整合測試的全過程,展示了核心 C/C++ 庫移植到 Android 衍生平台(OPhone)的標準化路徑,經驗可推廣至其他類似移植任務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved