日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android cmake 打印_Android使用CMAKE编译libjpeg

發布時間:2023/12/10 Android 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android cmake 打印_Android使用CMAKE编译libjpeg 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文主要介紹使用 CMAKE 編譯 libjpeg-turbo 類庫,本文相關代碼請在GitHub-TurboJpegSample 查看。

libjpeg-turbo 附GitHub 地址,libjpeg-turbo 是個運用極其廣泛的庫,可以說,基本上電腦上手機上能見到的 JPEG 壓縮的地方用的一般都是 libjpeg-turbo,本文只介紹使用了圖片壓縮的功能。

使用 Android 保存圖片時,我們通常使用的是 Bitmap.compress() 方法,但是使用該方法時,就算 quality 設置為 100,圖片質量還是會越來越模糊,顏色也會越來越綠~,至于為什么會這樣,請看 知乎回答。 這個問題在貼吧上體現尤為明顯,貼吧里面經常很多綠綠的圖片就是因為大家保存下來上傳上去,保存下來上傳上去 … 導致質量越拉越低,我解壓了 美圖秀秀 和 in 的 apk 發現里面都引用了 libjpeg.so,所以這個應該是一個比較通用的解決方案。

我們對圖片使用質量壓縮時它的底層就是用 skia 引擎進行處理,如我們調用bitmap.compress(Bitmap.CompressFormat.JPEG...) 他實際會 使用一個libjpeg.so 的動態庫進行編碼壓縮。android 在進行 jpeg 壓縮編碼的時候,考慮到了效率問題使用了定長編碼方式進行編碼(因為當時的手機性能都比較低),而 ios 使用了變長編碼的算法——哈夫曼算法。而且 IOS 對 skia 引擎也做了優化,所以我們看到同樣的圖片在 ios 上壓縮會好一點。

文檔就整理到這里吧,其實上面說的都是看了一些博客的介紹然后進行了整理和記錄,來清楚為什么我們需要自己來編譯 so 實現圖片壓縮。

資源準備

我們需要下載源碼編譯出 libjpeg.so 來使用,clone 源代碼。1git clone git://git.linaro.org/people/tomgall/libjpeg-turbo/libjpeg-turbo.git -b linaro-android

重命名根目錄 libjpeg-turbo 為 jni,進入 jni 目錄,首先你應該配置好 ndk, 使用 ndk-build 命令進行編譯。1

2

3

4mv libjpeg-turbo jni

ndk-build APP_ABI=armeabi-v7a,armeabi

編譯完成之后我們就可以獲取到 libjpeg.so,目錄如下:1

2

3

4

5

6

7

8

9

10jni

libs

- armeabi

- libjpeg.so

- armeabi-v7a

- libjpeg.so

obj

- local

- armeabi

- armeabi-v7a

此時如果出現了以下異常:1

2Users/march/AndroidRes/sdk/ndk-bundle/build/core/build-binary.mk:702:

*** Android NDK: Aborting (set APP_ALLOW_MISSING_DEPS=true to allow missing dependencies) . Stop.

打開 build-binary.mk 添加 APP_ALLOW_MISSING_DEPS=true1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18ifdef undefined_libs

$(call __ndk_warning,Module $(LOCAL_MODULE) depends on undefined modules: $(undefined_libs))

# ndk-build didn't used to fail the build for a missing dependency. This

# seems to have always been the behavior, so there's a good chance that

# there are builds out there that depend on this behavior (as of right now,

# anything using libc++ on ARM has this problem because of libunwind).

#

# By default we will abort in this situation because this is so completely

# broken. A user may define APP_ALLOW_MISSING_DEPS to "true" in their

# Application.mk or on the command line to revert to the old, broken

# behavior.

APP_ALLOW_MISSING_DEPS=true # here

ifneq ($(APP_ALLOW_MISSING_DEPS),true)

$(call __ndk_error,Aborting (set APP_ALLOW_MISSING_DEPS=true to allow missing dependencies))

endif

endif

創建工程

使用 AndroidStudio 新建工程,勾選 support c++,生成的工程中會包含 CMakeLists.txt 文件,在下面的介紹中沒有截圖,對目錄的說明如果不夠清晰,請至 GitHub-TurboJpegSample 查看工程代碼。

在 app 目錄下新建文件夾 libjpeg,用來存放 so 文件和頭文件,目錄如下:1

2

3

4

5

6

7

8

9

10

11

12app

- libjpeg

- prebuilt

- armeabi

- libjpeg.so

- include

- 頭文件

- src

- main

- cpp

- java

- res

編寫 compress.h 和 compress.c,這個就是壓縮的核心代碼了,篇幅較長,但是這里就不貼了,詳情請查看 項目的 cpp 目錄,使用的算法是網上查找的,看起來資料介紹的都是這一種。

CMakeLists.txt1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31# 最低版本

cmake_minimum_required(VERSION 3.4.1)

#設置生成的 so 動態庫最后輸出的路徑

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})

# 初始化目錄變量

set(libjpeg_dir ${CMAKE_SOURCE_DIR}/libjpeg)

set(INC_DIR ${libjpeg_dir}/include)

set(libjpeg_lib_dir ${libjpeg_dir}/prebuilt)

# 添加頭文件目錄

include_directories(${INC_DIR})

# 設置資源路徑

set(SOURCE_FILES src/main/cpp/compress.c)

#

add_library(compress SHARED

${SOURCE_FILES})

find_library(log-lib log)

find_library(graphics jnigraphics)

add_library(libjpeg SHARED IMPORTED)

set_target_properties(libjpeg PROPERTIES IMPORTED_LOCATION ${libjpeg_lib_dir}/${ANDROID_ABI}/libjpeg.so)

target_link_libraries(compress libjpeg ${log-lib} ${graphics})

build.gradle

相比普通的 Android 工程,app/build.gradle 文件也有些許不同,我只編譯了 armeabi 。1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39android {

compileSdkVersion 25

buildToolsVersion "25.0.3"

defaultConfig {

...

externalNativeBuild {

cmake {

abiFilters 'armeabi'

}

}

ndk {

//打包進APK的ABI類型

abiFilters 'armeabi'

}

}

externalNativeBuild {

cmake {

path "CMakeLists.txt"

}

}

sourceSets {

main {

java.srcDirs 'src/java'

jniLibs.srcDirs 'libs'

// jniLibs.srcDirs '../libjpeg/prebuilt', 'libs'

// 這里沒有添加libjpeg.so這個動態庫,也是可以執行的。

// 原因在于android本身使用了 libjpeg.so這個動態庫,

// 這個庫存放在/system/lib下,如果我們沒有加入

// libjpeg.so的話,他會去/system/lib下加載這個動態庫

// 如果android手機上沒有 libjpeg.so這個動態庫的話,

// 也可以使用: jniLibs.srcDirs '../libjpeg/prebuilt' 'libcd

// 將libjpeg.so加入到apk中

}

}

}

編寫 java 調用1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18public class{

static {

System.loadLibrary("compress");

}

/**

* 使用native方法進行圖片壓縮。

* Bitmap的格式必須是ARGB_8888 {@link android.graphics.Bitmap.Config}。

*

* @param bitmap 圖片數據

* @param quality 壓縮質量

* @param dstFile 壓縮后存放的路徑

* @param optimize 是否使用哈夫曼算法

* @return 結果

*/

public static native int compress(Bitmap bitmap, int quality, String dstFile, boolean optimize);

}

運行之后就可以測試結果,同時在 配置的 jniLibs 目錄中也會生成 so 文件,在別的地方使用同包名下的 TurboJpegUtils 類也可以調用了。

總結

測試對比結果,確實比 Andorid 原生的算法壓縮圖片的效果好很多,但是壓縮次數多了以后也會有明顯的模糊現象。

總結

以上是生活随笔為你收集整理的android cmake 打印_Android使用CMAKE编译libjpeg的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。