色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

總結移植三方庫到OpenHarmony的經驗

OpenAtom OpenHarmony ? 來源:OpenAtom OpenHarmony ? 作者:OpenAtom OpenHarmony ? 2022-05-07 15:52 ? 次閱讀

一、 介紹

三方庫指其他公司或者組織提供的服務或者模塊,例如常見的開源 OpenCV 庫,能持續繁榮 OpenAtom OpenHarmony(簡稱“OpenHarmony”)的生態建設。本文介紹如何在 RK3568 開發板上成功移植 OpenJPEG 開源庫。OpenJPEG 是一個用 C 語言編寫的開源 jpeg 2000 編解碼器,可以對圖片進行深度壓縮和解壓等。下面以 OpenJPEG 為例,總結移植三方庫到 OpenHarmony 的經驗。

二、開發步驟

三方庫主要是基于標準 Linux 系統的 c/c++ 開源庫,所以三方庫的移植工作,首先是在標準 Linux 系統搭建環境、編譯與驗證,然后將三方庫的編譯加入到 OpenHarmony 工程的構建中。

三方庫移植的主要開發步驟如下:

1.在標準Linux系統下載三方庫源碼,搭建開發環境,編譯整個源碼工程;

2.分析在標準Linux系統的編譯過程文件,提取編譯需要的源文件、編譯依賴等信息

3.根據上一步分析結果,編寫gn文件,將三方庫加入到OpenHarmony的編譯體系;

4.驗證編譯結果,在OpenHarmony的out目錄是否生成目標庫;

5.測試demo/測試單元用例執行。

注:標準系統編譯構方法可參考 標準系統編譯構建指導

https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/subsys-build-standard-large.md

三、開源庫的下載與編譯

下面以 OpenJPEG 開源庫為例,詳細的介紹開發流程。

1.搜索OpenJPEG開源庫

本示例的代碼庫鏈接地址:https://github.com/uclouvain/openjpeg

10ba12fc-cd3d-11ec-bce3-dac502259ad0.jpg

2.下載代碼

在 OpenHarmony/third_party 目錄下,輸入以下命令克隆 OpenJPEG 的源代碼:

git clone git@github.com:uclouvain/openjpeg.git

然后切換到 openjpeg-2.1 分支:

git checkout -b openjp-2.1

3. 執行編譯

代碼倉庫的 INSTALL.md 中詳細介紹了使用 CMake 編譯 OpenJPEG 庫的步驟。本文參考該文檔編譯了 OpenJPEG 庫。若在移植過程中對該庫的編譯選項有疑惑的地方,可參考該文檔。INSTALL 文檔中詳細的介紹了編譯步驟,如下圖:

10e245c4-cd3d-11ec-bce3-dac502259ad0.jpg

可以按以上信息,根據如下步驟編譯 openjpeg 工程,具體如下:

在 openjpeg 的目錄下,按以下步驟編譯:

mkdir buildcd buildcmake .. -DCMAKE_BUILD_TYPE=Releasemake

4. 編譯過程

整個編譯過程如下:

water@ubuntu:~/openjpeg/openjpeg/build$ make[  1%] Building C object src/lib/openjp2/CMakeFiles/openjp2_static.dir/thread.c.o[  2%] Building C object src/lib/openjp2/CMakeFiles/openjp2_static.dir/bio.c.o[  4%] Building C object src/lib/openjp2/CMakeFiles/openjp2_static.dir/cio.c.o[  5%] Building C object src/lib/openjp2/CMakeFiles/openjp2_static.dir/dwt.c.o[  7%] Building C object src/lib/openjp2/CMakeFiles/openjp2_static.dir/event.c.o[  8%] Building C object src/lib/openjp2/CMakeFiles/openjp2_static.dir/ht_dec.c.o[ 10%] Building C object src/lib/openjp2/CMakeFiles/openjp2_static.dir/image.c.o[ 11%] Building C object src/lib/openjp2/CMakeFiles/openjp2_static.dir/invert.c.o[ 13%] Building C object src/lib/openjp2/CMakeFiles/openjp2_static.dir/j2k.c.o[ 14%] Building C object src/lib/openjp2/CMakeFiles/openjp2_static.dir/jp2.c.o[ 16%] Building C object src/lib/openjp2/CMakeFiles/openjp2_static.dir/mct.c.o[ 17%] Building C object src/lib/openjp2/CMakeFiles/openjp2_static.dir/mqc.c.o[ 19%] Building C object src/lib/openjp2/CMakeFiles/openjp2_static.dir/openjpeg.c.o[ 20%] Building C object src/lib/openjp2/CMakeFiles/openjp2_static.dir/opj_clock.c.o[ 22%] Building C object src/lib/openjp2/CMakeFiles/openjp2_static.dir/pi.c.o[ 23%] Building C object src/lib/openjp2/CMakeFiles/openjp2_static.dir/t1.c.o[ 25%] Building C object src/lib/openjp2/CMakeFiles/openjp2_static.dir/t2.c.o[ 26%] Building C object src/lib/openjp2/CMakeFiles/openjp2_static.dir/tcd.c.o[ 28%] Building C object src/lib/openjp2/CMakeFiles/openjp2_static.dir/tgt.c.o[ 29%] Building C object src/lib/openjp2/CMakeFiles/openjp2_static.dir/function_list.c.o[ 31%] Building C object src/lib/openjp2/CMakeFiles/openjp2_static.dir/opj_malloc.c.o[ 32%] Building C object src/lib/openjp2/CMakeFiles/openjp2_static.dir/sparse_array.c.o[ 34%] Linking C static library ../../../bin/libopenjp2.a[ 34%] Built target openjp2_static[ 35%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/thread.c.o[ 37%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/bio.c.o[ 38%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/cio.c.o[ 40%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/dwt.c.o[ 41%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/event.c.o[ 43%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/ht_dec.c.o[ 44%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/image.c.o[ 46%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/invert.c.o[ 47%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/j2k.c.o[ 49%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/jp2.c.o[ 50%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/mct.c.o[ 52%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/mqc.c.o[ 53%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/openjpeg.c.o[ 55%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/opj_clock.c.o[ 56%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/pi.c.o[ 58%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/t1.c.o[ 59%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/t2.c.o[ 61%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/tcd.c.o[ 62%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/tgt.c.o[ 64%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/function_list.c.o[ 65%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/opj_malloc.c.o[ 67%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/sparse_array.c.o[ 68%] Linking C shared library ../../../bin/libopenjp2.so[ 68%] Built target openjp2[ 70%] Building C object src/bin/jp2/CMakeFiles/opj_dump.dir/opj_dump.c.o[ 71%] Building C object src/bin/jp2/CMakeFiles/opj_dump.dir/convert.c.o[ 73%] Building C object src/bin/jp2/CMakeFiles/opj_dump.dir/convertbmp.c.o[ 74%] Building C object src/bin/jp2/CMakeFiles/opj_dump.dir/index.c.o[ 76%] Building C object src/bin/jp2/CMakeFiles/opj_dump.dir/__/common/color.c.o[ 77%] Building C object src/bin/jp2/CMakeFiles/opj_dump.dir/__/common/opj_getopt.c.o[ 79%] Linking C executable ../../../bin/opj_dump[ 79%] Built target opj_dump[ 80%] Building C object src/bin/jp2/CMakeFiles/opj_compress.dir/opj_compress.c.o[ 82%] Building C object src/bin/jp2/CMakeFiles/opj_compress.dir/convert.c.o[ 83%] Building C object src/bin/jp2/CMakeFiles/opj_compress.dir/convertbmp.c.o[ 85%] Building C object src/bin/jp2/CMakeFiles/opj_compress.dir/index.c.o[ 86%] Building C object src/bin/jp2/CMakeFiles/opj_compress.dir/__/common/color.c.o[ 88%] Building C object src/bin/jp2/CMakeFiles/opj_compress.dir/__/common/opj_getopt.c.o[ 89%] Linking C executable ../../../bin/opj_compress[ 89%] Built target opj_compress[ 91%] Building C object src/bin/jp2/CMakeFiles/opj_decompress.dir/opj_decompress.c.o[ 92%] Building C object src/bin/jp2/CMakeFiles/opj_decompress.dir/convert.c.o[ 94%] Building C object src/bin/jp2/CMakeFiles/opj_decompress.dir/convertbmp.c.o[ 95%] Building C object src/bin/jp2/CMakeFiles/opj_decompress.dir/index.c.o[ 97%] Building C object src/bin/jp2/CMakeFiles/opj_decompress.dir/__/common/color.c.o[ 98%] Building C object src/bin/jp2/CMakeFiles/opj_decompress.dir/__/common/opj_getopt.c.o[100%] Linking C executable ../../../bin/opj_decompress[100%]Builttargetopj_decompress

依據上述信息中生成 openjp2 庫(libopenjp2.so)的過程可以知道編譯庫需要的 C 源文件,具體內如下所示:


[ 35%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/thread.c.o[ 37%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/bio.c.o[ 38%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/cio.c.o[ 40%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/dwt.c.o[ 41%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/event.c.o[ 43%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/ht_dec.c.o[ 44%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/image.c.o[ 46%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/invert.c.o[ 47%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/j2k.c.o[ 49%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/jp2.c.o[ 50%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/mct.c.o[ 52%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/mqc.c.o[ 53%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/openjpeg.c.o[ 55%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/opj_clock.c.o[ 56%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/pi.c.o[ 58%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/t1.c.o[ 59%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/t2.c.o[ 61%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/tcd.c.o[ 62%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/tgt.c.o[ 64%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/function_list.c.o[ 65%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/opj_malloc.c.o[ 67%] Building C object src/lib/openjp2/CMakeFiles/openjp2.dir/sparse_array.c.o[ 68%] Linking C shared library ../../../bin/libopenjp2.so[68%]Builttargetopenjp2

有了以上信息我們可以在后續分析的編譯文件中對比驗證,編譯庫需要的源文件。

5. 查看結果

整個的 build 目錄結構如下:


water@ubuntu:~/openjpeg/openjpeg/build$ tree -L 2.├── bin│ ├── libopenjp2.a│ ├── libopenjp2.so -> libopenjp2.so.7│ ├── libopenjp2.so.2.5.0│ ├── libopenjp2.so.7 -> libopenjp2.so.2.5.0│ ├── opj_compress│ ├── opj_decompress│ └── opj_dump├── CMakeCache.txt├── CMakeFiles│ ├── 3.16.3│ ├── CheckIncludeFiles│ ├── CheckTypeSize│ ├── cmake.check_cache│ ├── CMakeDirectoryInformation.cmake│ ├── CMakeError.log│ ├── CMakeOutput.log│ ├── CMakeTmp│ ├── Export│ ├── Makefile2│ ├── Makefile.cmake│ ├── progress.marks│ ├── TargetDirectories.txt│ ├── TestEndianess.bin│ └── TestLargeFiles.c├── cmake_install.cmake├── CPackConfig.cmake├── CPackSourceConfig.cmake├── CTestCustom.cmake├── libopenjp2.pc├── LICENSE.txt├── Makefile├── OpenJPEGConfig.cmake├── src│ ├── bin│ └── lib├── thirdparty│ ├── CMakeFiles│ ├── cmake_install.cmake│ └── Makefile└── wrapping    ├── CMakeFiles    ├── cmake_install.cmake└──Makefile

四、 分析編譯過程

1. 查看生成的庫

首先在 openjpeg/build/bin 目錄可以看出我們需要編譯生成的目標文件,分別為 libopenjp2.a、libopenjp2.so.2.5.0、opj_compress、opj_decompress、opj_dump,還有一些鏈接符號,經過閱讀代碼發現 opj_compress、opj_decompress 和 opj_dump 為一些測試相關的文件,因此可以不加入到代碼工程。

11033ef0-cd3d-11ec-bce3-dac502259ad0.jpg

2. 分析生成過程

從 build 目錄下的 Makefile 開始分析生成 libopenjp2.so 所依賴的 C 源文件、cflag 標志、需要包含的頭文件和需要鏈接的庫等信息。

在 openjpeg/build/Makefile 中,可以找到如下信息:


#=============================================================================# Target rules for targets named openjp2
# Build rule for target.openjp2: cmake_check_build_system  $(MAKE) -f CMakeFiles/Makefile2 openjp2.PHONY : openjp2
# fast build rule for target.openjp2/fast:  $(MAKE) -f src/lib/openjp2/CMakeFiles/openjp2.dir/build.make src/lib/openjp2/CMakeFiles/openjp2.dir/build.PHONY:openjp2/fast

由上述信息可以發現生成 openjp2 目標是依賴 CMakeFiles/Makefile2 文件。

因此再分析 openjpeg/build/CMakeFiles/Makefile2 這個文件,具體內如下:


#=============================================================================# Target rules for target src/lib/openjp2/CMakeFiles/openjp2.dir
# All Build rule for target.src/lib/openjp2/CMakeFiles/openjp2.dir/all:  $(MAKE) -f src/lib/openjp2/CMakeFiles/openjp2.dir/build.make src/lib/openjp2/CMakeFiles/openjp2.dir/depend  $(MAKE) -f src/lib/openjp2/CMakeFiles/openjp2.dir/build.make src/lib/openjp2/CMakeFiles/openjp2.dir/build  @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/water/openjpeg/openjpeg/build/CMakeFiles --progress-num=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 "Built target openjp2".PHONY : src/lib/openjp2/CMakeFiles/openjp2.dir/all
# Build rule for subdir invocation for target.src/lib/openjp2/CMakeFiles/openjp2.dir/rule: cmake_check_build_system  $(CMAKE_COMMAND) -E cmake_progress_start /home/water/openjpeg/openjpeg/build/CMakeFiles 23  $(MAKE) -f CMakeFiles/Makefile2 src/lib/openjp2/CMakeFiles/openjp2.dir/all  $(CMAKE_COMMAND) -E cmake_progress_start /home/water/openjpeg/openjpeg/build/CMakeFiles 0.PHONY : src/lib/openjp2/CMakeFiles/openjp2.dir/rule
# Convenience name for target.openjp2: src/lib/openjp2/CMakeFiles/openjp2.dir/rule
.PHONY : openjp2
# clean rule for target.src/lib/openjp2/CMakeFiles/openjp2.dir/clean:  $(MAKE) -f src/lib/openjp2/CMakeFiles/openjp2.dir/build.make src/lib/openjp2/CMakeFiles/openjp2.dir/clean.PHONY : src/lib/openjp2/CMakeFiles/openjp2.dir/clean
#=============================================================================

由以上內容可以發現最終是根據 src/lib/openjp2/CMakeFiles/openjp2.dir/build.make 來編譯生成 openjp2 庫。

因此需要再分析 openjpeg/build/src/lib/openjp2/CMakeFiles/openjp2.dir/build.mak

build.make 文件節選:


//包含depend.make文件# Include any dependencies generated for this target.include src/lib/openjp2/CMakeFiles/openjp2.dir/depend.make   
//包含flags.make文件,C_FLAG相關信息# Include the compile flags for this target's objects.include src/lib/openjp2/CMakeFiles/openjp2.dir/flags.make    
//依賴link.txt,鏈接相關信息cd /home/water/openharmony/third_party/openjpeg/build/src/lib/openjp2 && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/openjp2.dir/link.txt --verbose=$(VERBOSE)  cd /home/water/openharmony/third_party/openjpeg/build/src/lib/openjp2 && $(CMAKE_COMMAND) -E cmake_symlink_library ../../../bin/libopenjp2.so.2.5.0 ../../../bin/libopenjp2.so.7 ../../../bin/libopenjp2.so//編譯依賴的C# Object files for target openjp2openjp2_OBJECTS = "CMakeFiles/openjp2.dir/thread.c.o" "CMakeFiles/openjp2.dir/bio.c.o" "CMakeFiles/openjp2.dir/cio.c.o" "CMakeFiles/openjp2.dir/dwt.c.o" "CMakeFiles/openjp2.dir/event.c.o" "CMakeFiles/openjp2.dir/ht_dec.c.o" "CMakeFiles/openjp2.dir/image.c.o" "CMakeFiles/openjp2.dir/invert.c.o" "CMakeFiles/openjp2.dir/j2k.c.o" "CMakeFiles/openjp2.dir/jp2.c.o" "CMakeFiles/openjp2.dir/mct.c.o" "CMakeFiles/openjp2.dir/mqc.c.o" "CMakeFiles/openjp2.dir/openjpeg.c.o" "CMakeFiles/openjp2.dir/opj_clock.c.o" "CMakeFiles/openjp2.dir/pi.c.o" "CMakeFiles/openjp2.dir/t1.c.o" "CMakeFiles/openjp2.dir/t2.c.o" "CMakeFiles/openjp2.dir/tcd.c.o" "CMakeFiles/openjp2.dir/tgt.c.o" "CMakeFiles/openjp2.dir/function_list.c.o" "CMakeFiles/openjp2.dir/opj_malloc.c.o" "CMakeFiles/openjp2.dir/sparse_array.c.o"

通過分析 build.make 文件發現需要依賴 depend.make、flags.make 和 link.txt,由以上內容可以分析出如下信息:

111e0da2-cd3d-11ec-bce3-dac502259ad0.png

下面看下 flags.make 和 link.txt 文件的具體內容。

link.txt 的內容如下:

/usr/bin/cc-fPIC-O3-DNDEBUG-shared-Wl,-soname,libopenjp2.so.7-o../../../bin/libopenjp2.so.2.5.0CMakeFiles/openjp2.dir/thread.c.oCMakeFiles/openjp2.dir/bio.c.oCMakeFiles/openjp2.dir/cio.c.oCMakeFiles/openjp2.dir/dwt.c.oCMakeFiles/openjp2.dir/event.c.oCMakeFiles/openjp2.dir/ht_dec.c.oCMakeFiles/openjp2.dir/image.c.oCMakeFiles/openjp2.dir/invert.c.oCMakeFiles/openjp2.dir/j2k.c.oCMakeFiles/openjp2.dir/jp2.c.oCMakeFiles/openjp2.dir/mct.c.oCMakeFiles/openjp2.dir/mqc.c.oCMakeFiles/openjp2.dir/openjpeg.c.oCMakeFiles/openjp2.dir/opj_clock.c.oCMakeFiles/openjp2.dir/pi.c.oCMakeFiles/openjp2.dir/t1.c.oCMakeFiles/openjp2.dir/t2.c.oCMakeFiles/openjp2.dir/tcd.c.oCMakeFiles/openjp2.dir/tgt.c.oCMakeFiles/openjp2.dir/function_list.c.oCMakeFiles/openjp2.dir/opj_malloc.c.oCMakeFiles/openjp2.dir/sparse_array.c.o-lm-lpthread

從以上內容可以發現需要鏈接 -lm、-lpthread 這兩個庫。

flags.make 中的內容如下:


# CMAKE generated file: DO NOT EDIT!# Generated by "Unix Makefiles" Generator, CMake Version 3.16
# compile C with /usr/bin/ccC_FLAGS = -fPIC   -Wall -Wextra -Wconversion -Wunused-parameter -Wdeclaration-after-statement -Werror=declaration-after-statement
C_DEFINES = -DMUTEX_pthread -Dopenjp2_EXPORTS
C_INCLUDES=-I/home/water/openjpeg/openjpeg/build/src/lib/openjp2

從以上內容可以發現編譯需要的 C_FLAGS 信息。

3.提取有效信息

從上述分析可以提取以下信息:


需要包含的源文件: openjpeg/src/lib/openjp2/bio.c openjpeg/src/lib/openjp2/cio.c openjpeg/src/lib/openjp2/dwt.c openjpeg/src/lib/openjp2/event.c  openjpeg/src/lib/openjp2/function_list.c openjpeg/src/lib/openjp2/ht_dec.c openjpeg/src/lib/openjp2/image.c openjpeg/src/lib/openjp2/invert.c openjpeg/src/lib/openjp2/j2k.c  openjpeg/src/lib/openjp2/jp2.c openjpeg/src/lib/openjp2/mct.c openjpeg/src/lib/openjp2/mqc.c openjpeg/src/lib/openjp2/openjpeg.c openjpeg/src/lib/openjp2/opj_clock.c openjpeg/src/lib/openjp2/opj_malloc.c openjpeg/src/lib/openjp2/pi.c openjpeg/src/lib/openjp2/sparse_array.c openjpeg/src/lib/openjp2/t1.c openjpeg/src/lib/openjp2/t2.c openjpeg/src/lib/openjp2/tcd.c openjpeg/src/lib/openjp2/tgt.c openjpeg/src/lib/openjp2/thread.c 需要包含的頭文件: src/lib/openjp2 需要鏈接的庫: -lm -lpthread  編譯器需要添加的C_FLAGS標記:C_FLAGS=-O3-DNDEBUG-fPIC-ffast-math-Wall-Wextra-Wconversion-Wunused-parameter-Wdeclaration-after-statement-Werror=declaration-after-statement

從上述內容中我們可以獲取到編譯 libopenjp2.so 所需的源文件、頭文件、鏈接庫、C_FLAGS 等信息。接下來就可以根據這些信息在 OpenHarmony 的三方庫文件夾下的 openjpeg 目錄下編寫 BUILD.gn 腳本,把 openjpeg 加入到 OpenHarmony 的編譯體系中。

五、將三方庫加入OpenHarmony的編譯體系

接下來演示一下如何把 OpenJPEG 開源庫通過 BUILD.gn 腳本添加到 OpenHarmony 工程中

表1:添加到工程后的目錄結構

11324c4a-cd3d-11ec-bce3-dac502259ad0.png

1.OpenHarmony/build/subsystem_config.json 中添加 subsystem 節點。


"openjpeg":{"path":"third_party/openjpeg","name":"openjpeg"}

2.OpenHarmony/productdefine/common/products/rk3568.json 文件里面加入如下內容,添加板級相關的信息:


{  "product_name": "rk3568",  "product_company": "hihope",  "product_device": "rk3568",  "version": "2.0",  "type": "standard",  "product_build_path": "device/hihope/build",  "parts":{    "openjpeg:openjpeg_lib":{}       #新增openjpeg_lib  }}

3.third_partyopenjpeg ests 下添加 ohos.build 文件,以便系統可以編譯 tests 目錄下的測試文件:


third_partyopenjpeg	ests下添加ohos.build文件:{"subsystem":"openjpeg", "parts":{  "openjpeg_lib":{  "module_list":[      "http://third_party/openjpeg/tests:test_tile_decoder",#新增測試文件test_tile_decoder     "http://third_party/openjpeg/tests:test_tile_encoder",   #新增測試文件test_tile_encoder      ...........    ]   } }}

4.OpenHarmony//third_party/openjpeg/ 目錄添加 BUILD.gn 文件,根據不同的系統生成靜態或者動態庫,如下:


if (defined(ohos_lite)) {  import("http://build/lite/config/component/lite_component.gni")} else {  import("http://build/ohos.gni")}#編譯CFLAG標記和需要鏈接的庫config("openjpeg_cflag_config") {  cflags = [       "-O3" ,      "-DNDEBUG",      "-fPIC",      "-ffast-math",      "-Wall",      "-Wextra",      "-Wconversion",      "-Wunused-parameter",      "-Wdeclaration-after-statement",      "-Werror=declaration-after-statement",      ]    ldflags = [        "-lm",        "-lpthread",    ]}#需要包含的頭文件config("openjpeg_config") {    include_dirs = [        "http://third_party/openjpeg/src/lib/openjp2"    ]}#需要包含的源文件ohos_source_set("libopenjpeg_source") {    sources = [        "http://third_party/openjpeg/src/lib/openjp2/thread.c",        "http://third_party/openjpeg/src/lib/openjp2/bio.c",        "http://third_party/openjpeg/src/lib/openjp2/cio.c",        "http://third_party/openjpeg/src/lib/openjp2/dwt.c",        "http://third_party/openjpeg/src/lib/openjp2/event.c",        "http://third_party/openjpeg/src/lib/openjp2/ht_dec.c",        "http://third_party/openjpeg/src/lib/openjp2/image.c",        "http://third_party/openjpeg/src/lib/openjp2/invert.c",        "http://third_party/openjpeg/src/lib/openjp2/j2k.c",        "http://third_party/openjpeg/src/lib/openjp2/jp2.c",        "http://third_party/openjpeg/src/lib/openjp2/mct.c",        "http://third_party/openjpeg/src/lib/openjp2/mqc.c",        "http://third_party/openjpeg/src/lib/openjp2/openjpeg.c",        "http://third_party/openjpeg/src/lib/openjp2/opj_clock.c",        "http://third_party/openjpeg/src/lib/openjp2/pi.c",        "http://third_party/openjpeg/src/lib/openjp2/t1.c",        "http://third_party/openjpeg/src/lib/openjp2/t2.c",        "http://third_party/openjpeg/src/lib/openjp2/tcd.c",        "http://third_party/openjpeg/src/lib/openjp2/tgt.c",        "http://third_party/openjpeg/src/lib/openjp2/function_list.c",        "http://third_party/linu/src/lib/openjp2/opj_malloc.c",        "http://third_party/openjpeg/src/lib/openjp2/sparse_array.c",    ]}#根據不同系統編譯不同類型的庫lite類型的設備可以編程靜態庫,也可編成動態庫if (defined(ohos_lite)) {  lite_library("libjpeg") {    if (ohos_kernel_type == "liteos_m") {      target_type = "static_library"          #編譯成靜態庫libopenjpeg.a    } else {      target_type = "shared_library"          #編成動態庫libopenjpeg.z.so    }    sources = libopenjpeg_source              #依賴的源文件    public_configs = [ ":openjpeg_config" ]   #依賴的頭文件    configs = [ ":openjpeg_cflag_config" ]    #依賴的CFLAGS配置信息  }} else {  #標準系統編成動態庫,libopenjpeg.z.so  ohos_shared_library("openjpeg") {    deps = [ ":libopenjpeg_source" ]         #依賴的源文件    public_configs = [ ":openjpeg_config" ]  #依賴的頭文件配置信息    configs = [ ":openjpeg_cflag_config" ]   #依賴的CFLAGS配置信息    part_name = "openjpeg_lib"  }}

5.third_party/openjpeg/tests/ 目錄添加 BUILD.gn 文件,編譯測試文件,由于測試文件會依賴 OpenJPEG 庫,根據依賴關系(如下圖中的 deps)會鏈接到 thirdparty/openjpeg 下面的 BUILD.gn(即步驟 4 中的 BUILD.gn),最終此文件會編譯生成 libopenjpeg 庫。

third_party/openjpeg/tests/BUILD.gn 的內容如下:

118cd5ca-cd3d-11ec-bce3-dac502259ad0.jpg

以上幾個文件的具體調用關系如下圖所示:

12163d06-cd3d-11ec-bce3-dac502259ad0.jpg

通過 git status --ignored 命令可以查看我們修改什么內容,具體內如下:

1249836e-cd3d-11ec-bce3-dac502259ad0.jpg

通過以上操作以后,就可以在 OpenHarmony 編譯源碼了,編譯命令如下:


./build.sh--product-namerk3568--ccache

編譯完成以后可以在 /out/rk3568/packages/phone/system/lib 目錄下看到編譯生成的 libopenjpeg.z.so 文件。


water@ubuntu:~/OpenHarmony/out/rk3568/packages/phone/system/lib$ ls -l libopenjpeg.z.so -rwxr-xr-x1rootroot286148Mar2318:59libopenjpeg.z.so

同時,還可以在 out/rk3568/packages/phone/system/bin 目錄下看到我們編譯的測試文件 test_tile_encoder,如下所示:


water@ubuntu:~/openharmony/out/rk3568/packages/phone/system/bin$ ls -l test_test_decode_areatest_tile_decodertest_tile_encoder

把編譯完成的鏡像文件燒錄到 RK3568 開發板中,運行測試文件驗證整個庫的移植情況。

六、測試驗證

在開源庫的 tests 目錄下有很多測試用例,在 test 目錄下的 CMakeLists.txt 文件會生成一些測試文件來進行驗證,其中會給出一些測試方法,具體如下:

12808c88-cd3d-11ec-bce3-dac502259ad0.jpg

12a71efc-cd3d-11ec-bce3-dac502259ad0.jpg

代碼工程編譯完成后,將鏡像文件燒錄到 RK3568 開發板中,在開發板 /system/bin 文件夾下可以發現,有編譯 tests 目錄后生成的測試文件,如下所示:


# ls -l test_*                                                                 test_decode_areatest_open_jpeg.shtest_tile_decodertest_tile_encoder

在 data 目錄下創建 test 目錄:


# pwd/data#mkdirtest

把測試用例文件從 /bin 目錄下拷貝到 data/test 目錄下:


# pwd/data#cp/bin/test_*./

添加可執行權限:


chmod+xtest_tile_decoder

輸入如下命令:


./test_tile_encoder3200020001000100081tte1.j2k64644111256256

運行 test_tile_encoder,測試結果如下:

12c4e522-cd3d-11ec-bce3-dac502259ad0.png

至此,整個 OpenJPEG 開源庫在 OpenHarmony 上的移植就完畢,感興趣的開發者可以動手移植自己的三方庫了。

附錄

開發過程中遇到的問題:


In file included from ../../third_party/openjpeg/src/lib/openjp2/thread.c:431:../../third_party/openjpeg/src/lib/openjp2/opj_includes.h:40:10: fatal error: 'opj_config_private.h' file not found#include"opj_config_private.h"

由于 opj_config_private.h 是由 cmake 生成的,因此需要在 Linux 下編譯整個 OpenJPEG 源碼,然后把生成的 opj_config_private.h 拷貝到相應的目錄下:


cp ./build/src/lib/openjp2/opj_config_private.h /src/lib/./build/src/bin/common/opj_apps_config.h/cp ./build/src/lib/openjp2/opj_config.h /src/lib/openjp2/cp./build/src/bin/common/opj_apps_config.h./src/bin/common/

遇到重定義問題,在 third_party/openjpeg/tests/pdf2jp2.c 文件中把這行定義注釋掉:


../../third_party/openjpeg/tests/pdf2jp2.c:45:9: error: '_GNU_SOURCE' macro redefined [-Werror,-Wmacro-redefined]#define_GNU_SOURCE

RK3568 開發板相關的操作可以參考如下文檔:

RK3568 開發板標準設備上手-HelloWorld

https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11292

    瀏覽量

    209328
  • 開源
    +關注

    關注

    3

    文章

    3309

    瀏覽量

    42471
  • OpenHarmony
    +關注

    關注

    25

    文章

    3713

    瀏覽量

    16254

原文標題:一文帶你讀懂如何移植三方庫到OpenHarmony

文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    鴻蒙原生開源ViewPool在OpenHarmony社區正式上線

    方面的實踐經驗。它為鴻蒙生態的開發者和應用廠商提供了一套靈活高效的跨端組件管理方案,有助于顯著提升開發效率和應用性能。 作為一款專為OpenHarmony設計的原生開發,ViewPool具備全面的功能支持,并采用了多項創新技術
    的頭像 發表于 12-20 14:44 ?143次閱讀

    三方檢測機構該如何提升核心競爭力?

    在國家“一帶一路”和“智能制造2025”等政策的引領下,面對競爭日益激烈的國際環境,作為全球最大的制造業國家,中國的檢測行業正經歷著迅猛的發展,成為全球增長最快、潛力最大的市場之一。 第三方檢測逐漸
    的頭像 發表于 12-17 15:44 ?71次閱讀
    第<b class='flag-5'>三方</b>檢測機構該如何提升核心競爭力?

    億緯鋰能與武漢大學、德布勒森大學簽署三方合作諒解備忘錄

    近日,億緯鋰能、武漢大學(以下簡稱“武大”)與匈牙利德布勒森大學(以下簡稱“德大”)在武漢舉行三方合作諒解備忘錄簽署儀式,標志著三方在鋰電池行業對德布勒森可持續發展影響領域的研究合作正式達成,開啟向奔赴合作新篇章。
    的頭像 發表于 11-07 14:46 ?274次閱讀

    鴻蒙Flutter實戰:05-使用第三方插件

    # 鴻蒙Flutter 實戰:使用第三方插件 在鴻蒙Flutter開發中,如果涉及使用原生功能,就要使用插件。使用插件有兩種方式,一種是自己編寫原生ArkTS代碼,在Dart側調用。另外一種
    發表于 10-22 21:54

    維天地低代碼開發平臺助力第三方質檢行業數據可視化

    三方檢驗是由獨立于買賣雙方利益之外的第三方機構(例如專業的監督檢驗機構)執行的,這些機構以公正、公平、權威的非當事人身份,依據雙方共同認可的法律、標準和合同等進行商品的符合性檢驗和認證活動
    的頭像 發表于 08-09 13:59 ?265次閱讀
    <b class='flag-5'>三</b>維天地低代碼開發平臺助力第<b class='flag-5'>三方</b>質檢行業數據可視化

    請問esp8266會開放使用第三方云服務器嗎?

    如題,esp8266會開放使用第三方云服務器嗎,如百度,阿里云服務器?
    發表于 07-12 11:40

    微軟或將開放Xbox主機授權給第三方廠商

    據悉,5 月 26 日,知名媒體 Windows Central 的編輯 Jez Corden 揭露了微軟即將遵循第三方手柄流程,允許在其 XBOX 主機上引入第三方產品。
    的頭像 發表于 05-27 15:18 ?653次閱讀

    鴻蒙OpenHarmony【集成三方SDK】 (基于Hi3861開發板)

    OpenHarmony致力于打造一套更加開放完善的IoT生態系統,為此OpenHarmony規劃了一組目錄,用于將各廠商的SDK集成OpenHarmony中。本文檔基于Hi3861開
    的頭像 發表于 04-24 15:11 ?1105次閱讀
    鴻蒙<b class='flag-5'>OpenHarmony</b>【集成<b class='flag-5'>三方</b>SDK】 (基于Hi3861開發板)

    Labview如何內嵌操作第三方EXE程序!

    自己在網上搜了下相關資料,能把第三方EXE內嵌進入容器里,但是有個問題,這個第三方軟件必須手動拖到容器正中間,手動最大化。請問有什么方法可以自動實現嗎? 下圖是我內嵌的POLL 軟件。如圖!
    發表于 04-18 14:26

    鴻蒙OS開發學習:【第三方調用】

    在Stage模型中,如何調用已經上架到[三方中心]的社區和項目內創建的本地
    的頭像 發表于 04-14 11:34 ?902次閱讀
    鴻蒙OS開發學習:【第<b class='flag-5'>三方</b><b class='flag-5'>庫</b>調用】

    微軟或將引入第三方數字游戲商店至Xbox平臺

    微軟選擇引入這些第三方游戲平臺,一面可以增加自身擁有的硬件資源和服務優勢;另一面,也是為了吸引那些在電腦端能夠自由選擇游戲購買渠道的游戲用戶。據悉,此前的Xbox系列產品都是只內置自家的商城。
    的頭像 發表于 03-27 15:51 ?489次閱讀

    鴻蒙開發學習:【OpenHarmony HAR】

    OpenHarmony js/ts三方使用的是OpenHarmony靜態共享包,即HAR(Harmony Archive),可以包含js/ts代碼、c++
    的頭像 發表于 03-18 16:27 ?743次閱讀

    Meta Quest頭顯將支持多款安卓第三方應用并行

    Meta已悄然啟動了與此相關的功能,意味著Quest頭顯可同時操作多個第三方Android應用。在此之前,Quest對第三方Android應用有嚴格限制,用戶每次僅能打開一個,無法實現同屏幕并行多個第三方應用進程。
    的頭像 發表于 03-11 10:58 ?739次閱讀

    MacPaw將于4月在歐洲市場推出Setapp第三方應用商城

    3月1日報道,知名廠商MacPaw于今日發表聲明,宣稱其自有的第三方應用商城Setapp將進軍歐洲市場,發布會定于今年4月舉行,并且官網預告了可供用戶試用的候選頁面,以吸引更多人參與Setapp移動版本Beta的測試中來。
    的頭像 發表于 03-01 10:16 ?557次閱讀

    【堅果派】JS開源適配OpenHarmony系列——第一期實操

    由于OpenHarmony應用是基于ArkTS開發,而ArkTS是在保持TypeScript(簡稱TS)基礎語法風格的基礎上,對TS的動態類型特性施加更嚴格的約束,引入靜態類型。因此在開發OpenHarmony三方
    的頭像 發表于 12-26 10:48 ?1160次閱讀
    【堅果派】JS開源<b class='flag-5'>庫</b>適配<b class='flag-5'>OpenHarmony</b>系列——第一期實操
    主站蜘蛛池模板: 国产露脸A片国语露对白| 精品无码国产污污污免费网站2| 日韩一区二区三区精品| 国产CHINESE HD精品| 亚洲精品天堂在线| 久久偷拍免费2017| 成人无码在线超碰视频 | 父亲在线日本综艺免费观看全集| 让人爽到湿的小黄书| 国产精品久久一区二区三区蜜桃| 亚欧免费观看在线观看更新| 久久亚洲精品2017| 成人性生交大片免费看4| 一区二一二| 少妇第一次交换| 免费的好黄的漫画| 国产爱豆果冻传媒在线观看| 亚洲人女同志video| 日本不卡三卡四卡| 玖玖爱在线播放| 国内精品久久久久影院男同志| 99re.05久久热最新地址| 亚洲欧美自拍明星换脸| 全文都是肉高h文| 免费久久狼人香蕉网| 精品国产自在现线拍国语| 帝王被大臣们调教高肉| 99re6久久热在线播放| 亚洲天堂一区二区三区| 色婷婷国产精品视频一区二区三区| 久久精品中文字幕| 欧美123区| 葵司中文第一次大战黑人| 黄色小说男男| 国产欧美另类久久久精品免费| 成人国内精品久久久久影| 99久久99久久久99精品齐| 最近免费中文字幕完整版HD| 亚洲中文在线精品国产| 亚洲色欲色欲www474ee| 亚洲欧美高清在线|