安卓實現miniLzo壓縮算法

LZO官方源碼

http://www.oberhumer.com/opensource/lzo

找到miniLZO點擊Dowload miniLZO下載源碼

http://www.oberhumer.com/opensource/lzo/download/minilzo-2.10.tar.gz

demo源碼(包含安卓)

https://github.com/xzw421771880/MiniLzo_Mobile.git

1.代碼部分

1.1.測試用例

public void lzo_compress_decompress(){String ss = "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";System.out.println("原16進制數據"+ss);//原數據字節流格式byte[] bytes = hexStr2ByteArr(ss);//開始壓縮bytes = JNITools.lzo_compress(bytes);System.out.println("Lzo壓縮后16進制數據"+byteTobyteStr(bytes));//開始解壓bytes = JNITools.lzo_decompress(bytes);System.out.println("Lzo解壓后16進制數據"+byteTobyteStr(bytes));
}

1.2實現流程

1.2.1.新建工程(參考源碼中名為minilzo的moudle)

1.2.2.在src/main目錄下新建文件jni

1.2.3.將從lzo官方下載的文件中(lzoconf.h,lzodefs.h,minilzo.h,minilzo.c)放入jni文件

1.2.4.新建jnitools.c文件(或者直接復制)

1.2.5.引入相關文件頭

#include <jni.h>
#include <android/log.h>
#include <stdio.h>
#include <stdlib.h>#include "minilzo.h"#define IN_LEN      (128*1024ul)
#define OUT_LEN     (IN_LEN + IN_LEN / 16 + 64 + 3)#define LOG_TAG "MyTag"static unsigned char __LZO_MMODEL in1  [ IN_LEN ];
static unsigned char __LZO_MMODEL out1 [ OUT_LEN ];#define HEAP_ALLOC(var,size) \lzo_align_t __LZO_MMODEL var [ ((size) + (sizeof(lzo_align_t) - 1)) / sizeof(lzo_align_t) ]static HEAP_ALLOC(wrkmem, LZO1X_1_MEM_COMPRESS);

1.2.6.實現壓縮

jbyteArray compress(JNIEnv *env,jclass clazz,jbyteArray a){//將jbyteArray轉成jbyte *格式jsize length = (*env)->GetArrayLength(env,a);jbyte *bytes = (*env)->GetByteArrayElements(env,a, NULL);//將jbyte *格式轉成unsigned char *unsigned char *unsignedChars = (unsigned char *)malloc(length * sizeof(unsigned char));memcpy(unsignedChars, bytes, length * sizeof(unsigned char));(*env)->ReleaseByteArrayElements(env,a, bytes, 0);//執行lzo壓縮int length1 = lzo_compress1(unsignedChars, (int )length);jbyteArray jArray = (*env)->NewByteArray(env, length1);// 復制數據從cArray到jArray(*env)->SetByteArrayRegion(env, jArray, 0, length1, (jbyte*)out1);//釋放內存
//    (*env)->ReleaseByteArrayElements(env,a, bytes, 0);
//    free(unsignedChars);return jArray;
}int  lzo_compress1(unsigned char * data,int datalen)
{
//    __android_log_print(ANDROID_LOG_DEBUG, "JNITag", "datalen-%d",datalen);int r;lzo_uint in_len;lzo_uint out_len;/** Step 1: initialize the LZO library*/if (lzo_init() != LZO_E_OK){printf("internal error - lzo_init() failed !!!\n");printf("(this usually indicates a compiler bug - try recompiling\nwithout optimizations, and enable '-DLZO_DEBUG' for diagnostics)\n");}in_len = IN_LEN;in_len = datalen;//    lzo_memset(in,0,in_len);
//    in = data;//    unsigned char __LZO_MMODEL newout [ OUT_LEN ];printf("out----%s\n",out1);//__android_log_print(ANDROID_LOG_DEBUG, "JNITag", "out0---%s",out1);r = lzo1x_1_compress(data,datalen,out1,&out_len,wrkmem);//__android_log_print(ANDROID_LOG_DEBUG, "JNITag", "out1---%s",out1);//    printf("out----%s\n",out1);if (r == LZO_E_OK){printf("compressed %lu bytes into %lu bytes\n",(unsigned long) in_len, (unsigned long) out_len);__android_log_print(ANDROID_LOG_DEBUG, "JNITag", "compressed %lu bytes into %lu bytes\n",(unsigned long) in_len, (unsigned long) out_len);}else{/* this should NEVER happen */printf("internal error - compression failed: %d\n", r);__android_log_print(ANDROID_LOG_DEBUG, "JNITag", "internal error - compression failed: %d\n", r);}/* check for an incompressible block */
//    if (out_len >= in_len)
//    {
//        printf("This block contains incompressible data.\n");
//        return 0;
//    }
//    unsigned char *a = lzo_decompress(out,in, out_len);return out_len;
}

1.2.7.實現解壓

jbyteArray decompress(JNIEnv *env,jclass clazz,jbyteArray a){//將jbyteArray轉成jbyte *格式jsize length = (*env)->GetArrayLength(env,a);jbyte *bytes = (*env)->GetByteArrayElements(env,a, NULL);//將jbyte *格式轉成unsigned char *unsigned char *unsignedChars = (unsigned char *)malloc(length * sizeof(unsigned char));memcpy(unsignedChars, bytes, length * sizeof(unsigned char));(*env)->ReleaseByteArrayElements(env,a, bytes, 0);//執行lzo解壓int length1 = lzo_decompress1(unsignedChars, (int )length);jbyteArray jArray = (*env)->NewByteArray(env, length1);// 復制數據從cArray到jArray(*env)->SetByteArrayRegion(env, jArray, 0, length1, (jbyte*)in1);//釋放內存
//    (*env)->ReleaseByteArrayElements(env,a, bytes, 0);
//    free(unsignedChars);return jArray;
}int lzo_decompress1(unsigned char * data,int datalen)
{int r;lzo_uint out_len;if (lzo_init() != LZO_E_OK){printf("internal error - lzo_init() failed !!!\n");printf("(this usually indicates a compiler bug - try recompiling\nwithout optimizations, and enable '-DLZO_DEBUG' for diagnostics)\n");}out_len = 0;//    printf("%s",in1);r = lzo1x_decompress(data,datalen,in1,&out_len,NULL);
//    printf("%s",in);
//    printf("%s",in1);if (r == LZO_E_OK)printf("decompressed %lu bytes back into %lu bytes\n",(unsigned long) datalen, (unsigned long) out_len);else{/* this should NEVER happen */printf("internal error - decompression failed: %d\n", r);}return out_len;
}

1.2.8.java部分(新建JNItools)

public class JNITools {static {System.loadLibrary("jnidemo");}//加法public static native byte[] lzo_compress(byte[] a);public static native byte[] lzo_decompress(byte[] a);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/100481.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/100481.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/100481.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何在ubuntu下用pip安裝aider,解決各種報錯問題

aider中文文檔網站上給出的安裝說明比較簡單&#xff1a; https://aider.doczh.com/docs/install.html 但是在一個干凈的ubuntu環境中按文檔中的命令安裝時&#xff0c;會報錯&#xff0c;經過一番嘗試之后&#xff0c;解決了報錯問題&#xff0c;成功完成了安裝。 成功安裝執…

Kotlin flow詳解

流式數據處理基礎 Kotlin Flow 是基于協程的流式數據處理 API&#xff0c;要深入理解 Flow&#xff0c;首先需要明確流的概念及其處理方式。 流(Stream)如同水流&#xff0c;是一種連續不斷的數據序列&#xff0c;在編程中具有以下核心特征&#xff1a; 數據按順序產生和消費支…

DeepSeek V3 深度解析:MoE、MLA 與 GRPO 的架構革新

簡介 DeepSeek&#xff08;深度求索&#xff09;是一家源自中國的人工智能公司&#xff0c;成立于2023年&#xff0c;總部位于中國杭州。前身是國內量化投資巨頭幻方量化的子公司。公司專注于開發低成本、高性能的AI模型&#xff0c;致力于通過技術創新推動人工智能技術的普惠…

Flask學習筆記(三)--URL構建與模板的使用

一、URL構建url_for()函數對于動態構建特定函數的URL非常有用。 該函數接受函數的名稱作為第一個參數&#xff0c;并接受一個或多個關鍵字參數&#xff0c;每個參數對應于URL的變量部分。from flask import Flask, redirect, url_forapp Flask(__name__)app.route(/admin)def …

Pyside6 + QML - 從官方的例程開始

導言如上所示&#xff0c;登上Qt Pyside6的官方網址&#xff1a;https://doc.qt.io/qtforpython-6/index.html&#xff0c;點擊“Write your first Qt application”的"Start here!"按鈕。 效果&#xff1a;工程代碼&#xff1a; github:https://github.com/q1641293…

Python爬蟲實戰:研究Pandas,構建物聯網數據采集和分析系統

1. 引言 1.1 研究背景 物聯網(Internet of Things, IoT)作為新一代信息技術的重要組成部分,已廣泛應用于智能交通、環境監測、智慧家居等多個領域。據 Gartner 預測,到 2025 年全球物聯網設備數量將達到 750 億臺,產生的數據量將突破 zettabyte 級別。物聯網平臺作為數據…

深度學習入門基石:線性回歸與 Softmax 回歸精講

一、線性回歸&#xff1a;從房價預測看懂 “連續值預測” 邏輯 線性回歸是深度學習的 “敲門磚”&#xff0c;它的核心思想是用線性關系擬合數據規律&#xff0c;解決連續值預測問題—— 比如根據房屋特征估算房價、根據溫度濕度預測降雨量等。 1. 從生活案例到數學模型 拿房價…

GPT-5-Codex CLI保姆級教程:獲取API Key配置與openai codex安裝詳解

朋友們&#xff0c;就在 2025 年 9 月中旬&#xff0c;OpenAI 悄悄扔下了一顆重磅炸彈&#xff1a;GPT-5-Codex。 如果你以為這只是又一次平平無奇的模型升級&#xff0c;那可就大錯特錯了。 我可以這么說&#xff1a;軟件開發的游戲規則&#xff0c;從這一刻起&#xff0c;可能…

基于Spark的用戶實時分析

Spark的最簡安裝 1. 下載并解壓 Spark 首先,我們需要下載 Spark 安裝包。您可以選擇以下方式之一: 方式一:從官網下載(推薦) # 在 hadoop01 節點上執行 cd /home/hadoop/app wget https://archive.apache.org/dist/spark/spark-2.3.1/spark-2.3.1-bin-hadoop2.7.tgz方…

OpenCV 風格遷移、DNN模塊 案例解析及實現

圖像風格遷移是計算機視覺領域極具趣味性的技術之一 —— 它能將普通照片&#xff08;內容圖像&#xff09;與藝術畫作&#xff08;風格圖像&#xff09;的特征融合&#xff0c;生成兼具 “內容輪廓” 與 “藝術風格” 的新圖像。OpenCV 的 DNN&#xff08;深度神經網絡&#x…

MySQL 日志:undo log、redo log、binlog以及MVCC的介紹

一、MySQL 日志&#xff1a;undo log、redo log、binlogundo log&#xff08;回滾日志&#xff09;&#xff1a;是 Innodb 存儲引擎層生成的日志&#xff0c;實現了事務中的原子性&#xff0c;主要用于事務回滾和 MVCC&#xff08;隔離性&#xff09;。 redo log&#xff08;重…

【面板數據】省及地級市農業新質生產力數據集(2002-2025年)

農業新質生產力是以科技創新為核心驅動力&#xff0c;以科技化、數字化、網絡化和智能化為主線&#xff0c;通過技術革命性突破、生產要素創新性配置、產業深度轉型升級&#xff0c;實現農業全要素生產率顯著躍升的先進生產力形態 本數據基于2002-2025年各省政府工作報告中關于…

20250917在榮品RD-RK3588-MID開發板的Android13系統下使用tinyplay播放wav格式的音頻

input keyevent 24 1|console:/sdcard # cat /proc/asound/cards console:/sdcard # ls -l /dev/snd/【需要打開Android13內置的音樂應用才會有聲音出來&#xff0c;原因未知&#xff01;】 1|console:/sdcard # tinyplay /sdcard/Music/kiss8.wav -D 1 -d 020250917在榮品RD-R…

總共分為幾種IP

IP&#xff08;Internet Protocol&#xff09;地址根據不同的分類標準可分為多種類型&#xff0c;以下是常見的分類方式&#xff1a;按版本分類IPv4&#xff1a;32位地址&#xff0c;格式為四組十進制數字&#xff08;如192.168.1.1&#xff09;&#xff0c;約43億個地址&#…

【Linux】常用命令(六)

【Linux】常用命令&#xff08;六&#xff09;1. yum命令1.1 基本語法1.2 常用命令2. 從服務器把數據cp到本地3. uname命令3.1 常用命令1. yum命令 全稱&#xff1a;Yellowdog Updater, Modified作用&#xff1a;是 RPM 包管理器的前端工具&#xff0c;用于基于 RPM 的 Linux …

go grpc開發使用

1、安裝proto 下載 Windows 版本 打開官方發布頁面 訪問 Protocol Buffers 的 GitHub Releases 頁面&#xff1a; &#x1f449; https://github.com/protocolbuffers/protobuf/releases 解壓 ZIP 文件 將下載的 ZIP 文件解壓到一個你容易找到的目錄&#xff0c;例如&#xff1…

MyBatis分頁:PageHelper

MyBatis分頁&#xff1a;PageHelper &#x1f4d6; 前言&#xff1a;為什么需要分頁&#xff1f; 在處理大量數據時&#xff0c;一次性從數據庫查詢并返回所有結果是不可行的&#xff0c;這會帶來巨大的性能和內存開銷。分頁是解決這一問題的標準方案。而PageHelper是一個極其流…

Gin框架:構建高性能Go Web應用

Gin框架&#xff1a;構建高性能Go Web應用 Gin是Go語言中最受歡迎的Web框架之一&#xff0c;以其高性能、簡潔API和豐富的中間件支持而聞名。本文將帶你從零開始&#xff0c;逐步掌握Gin框架的核心概念和高級特性&#xff0c;并通過實際代碼示例演示如何構建高效的Web應用程序。…

IO進程——線程、IO模型

一、線程Thread1、引入1.1 概念相當于是一個輕量級的進程&#xff0c;為了提高系統的性能引入線程&#xff0c;在同一進程中可以創建多個線程&#xff0c;共享進程資源1.2 進程和線程比較相同點&#xff1a;都為操作系統提供了并發執行的能力不同點&#xff1a;調度和資源&…

人工智能概念:NLP任務的評估指標(BLEU、ROUGE、PPL、BERTScore、RAGAS)

文章目錄一、評估指標基礎1. 準確率&#xff08;Accuracy&#xff09;2. 精確率&#xff08;Precision&#xff09;3. 召回率&#xff08;Recall&#xff09;4. F1-Score5. 示例二、文本生成專用指標1. BLEU&#xff1a;機器翻譯與標準化文案的“質量標尺”1.1 計算流程&#x…