安卓实现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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…