最简单的ndk调用!通过libjpeg库来加载图片,避免了oom~

Android编译libjpeg/libpng动态库,生成libpng.so 1. 引言 项目是需要jni实现图片的解码,而最通用的图片解码库就是libjpeg和libpng了,分别实现jpeg和png图片的解码。Android中Bitmap的解码就是通过这两个开源库来实现的,所以可以从Android的系统中找到libjpeg.so和libpng.so,但是在实际的使用中会在加载动态库的时候崩溃,提示提醒找不到libc++.se,真是莫名其妙的错误啊,可能是由于库的版本 阅读详情

我在这里说下显而易见的优势:大量节省上传流量,处理后的图片效果和前期原图基本没啥变化,但是质量可以相差10倍!!是不是狠diao~,
老司机先上图,这里写图片描述
有没有一种被惊艳的感觉~!

  • 再看看点击原图片查看详细内容:
  • 这里写图片描述

    • 接下来看看 处理后的图片查看详细内容:
  • 这里写图片描述

图是最好的说明!有没有被震撼到呢?开始开车吧。

  • 我们平常的图片压缩,如果通过java去处理,是比较麻烦的,要么就是质量压缩代码如下:
微信的缩略图要求是不大于32k,这就需要对我的图片进行压缩。试了几种方法,一一道来。

  代码如下

  ByteArrayOutputStream baos =  new  ByteArrayOutputStream();
  image.compress(Bitmap.CompressFormat.JPEG,  100 , baos);
  int  options =  100 ;
  while  ( baos.toByteArray().length /  1024 > 32 ) {
  baos.reset();
  image.compress(Bitmap.CompressFormat.JPEG, options, baos);
  options -=  10 ;
  }
  ByteArrayInputStream isBm =  new  ByteArrayInputStream(baos.toByteArray());
  Bitmap bitmap = BitmapFactory.decodeStream(isBm,  null ,  null );
  最开始使用这个来进行压缩,但是始终压缩不到32k这么小。后来看高手的解释才明白,这种压缩方法之所以称之为质量压缩,是因为它不会减少图片的像素。它是在保持像素的前提下改变图片的位深及透明度等,来达到压缩图片的目的。进过它压缩的图片文件大小会有改变,但是导入成bitmap后占得内存是不变的。因为要保持像素不变,所以它就无法无限压缩,到达一个值之后就不会继续变小了。显然这个方法并不适用与缩略图,其实也不适用于想通过压缩图片减少内存的适用,仅仅适用于想在保证图片质量的同时减少文件大小的情况而已。
  2、采样率压缩法:

  代码如下

  ByteArrayOutputStream out = new ByteArrayOutputStream();
  image.compress(Bitmap.CompressFormat.JPEG, 100, out);
  BitmapFactory.Options newOpts =  new  BitmapFactory.Options();
  int be = 2;
  newOpts.inSampleSize = be;
  ByteArrayInputStream isBm =  new  ByteArrayInputStream(out.toByteArray());
  Bitmap bitmap = BitmapFactory.decodeStream(isBm,  null ,  null );
  第二个使用的是这个方法,可以将图片压缩到足够小,但是也有一些问题。因为采样率是整数,所以不能很好的保证图片的质量。如我们需要的是在2和3采样率之间,用2的话图片就大了一点,但是用3的话图片质量就会有很明显的下降。这样也无法完全满足我的需要。不过这个方法的好处是大大的缩小了内存的使用,在读存储器上的图片时,如果不需要高清的效果,可以先只读取图片的边,通过宽和高设定好取样率后再加载图片,这样就不会过多的占用内存。如下

  BitmapFactory.Options newOpts =  new  BitmapFactory.Options();
  newOpts.inJustDecodeBounds =  true ;
  Bitmap bitmap = BitmapFactory.decodeFile(path,newOpts);
  newOpts.inJustDecodeBounds =  false ;
  int  w = newOpts.outWidth;
  int  h = newOpts.outHeight;
  //计算出取样率
  newOpts.inSampleSize = be;
  bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
  这样的好处是不会先将大图片读入内存,大大减少了内存的使用,也不必考虑将大图片读入内存后的释放事宜。

但是这不是我想要的结果!,因为它不能保证图片的质量。

-在使用这个库的之前先介绍下这个库吧,以前把它已经嵌入到系统里面的,但是到时考虑手机硬件没那么发达,后来skia出世后就是对它的第二次封装,只不过把以前jpeg的哈夫曼编码这一块屏蔽了(关于哈夫曼编码自己百度吧),但是到了现在我们手机的硬件已经跟上来了,所以以前的那种情况就不用担心了,所以哟~现在直接拿libjpeg这个库来使用。

  • 看下代码结构:
    这里写图片描述

MainActivity.java:

/*
 * Copyright 2014 http://Bither.net
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.example.testjpg;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import net.bither.util.NativeUtil;

public class MainActivity extends Activity {
    private static final int RESULT = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // testJpeg();
        setContentView(R.layout.main);
    }

    // 加载图片
    public void load(View v) {
        // 在CODE上查看代码片派生到我的代码片
        Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(intent, RESULT);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK && requestCode == RESULT) {
            Uri uri = data.getData();
            Log.e("eee", uri.toString());
            try {
                Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
                File dirFile = getExternalCacheDir();
                if (!dirFile.exists()) {
                    dirFile.mkdirs();
                }
                File truefile = new File(dirFile, "处理后图片.jpeg");
                File orignalfile = new File(dirFile, "原图片.jpeg");
                NativeUtil.compressBitmap(bitmap, orignalfile.getAbsolutePath(), false);
                NativeUtil.compressBitmap(bitmap, 20, truefile.getAbsolutePath(), true);

            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }

    private void testJpeg() {
        new Thread(new Runnable() {
            public void run() {
                try {
                    int quality = 30;
                    InputStream in = getResources().getAssets().open("test.jpg");
                    Bitmap bit = BitmapFactory.decodeStream(in);
                    File dirFile = getExternalCacheDir();
                    if (!dirFile.exists()) {
                        dirFile.mkdirs();
                    }
                    File originalFile = new File(dirFile, "original.jpg");
                    FileOutputStream fileOutputStream = new FileOutputStream(originalFile);
                    bit.compress(CompressFormat.JPEG, quality, fileOutputStream);
                    File jpegTrueFile = new File(dirFile, "jpegtrue.jpg");
                    File jpegFalseFile = new File(dirFile, "jpegfalse.jpg");
                    NativeUtil.compressBitmap(bit, quality, jpegTrueFile.getAbsolutePath(), true);
                    NativeUtil.compressBitmap(bit, quality, jpegFalseFile.getAbsolutePath(), false);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        }).start();
    }

    // Uri获取真实路径转换成File的方法
    protected String getAbsoluteImagePath(Uri uri) {
        // can post image
        String[] proj = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(uri, proj, // Which columns to return
                null, // WHERE clause; which rows to return (all rows)
                null, // WHERE clause selection arguments (none)
                null); // Order-by clause (ascending by name)

        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();

        return cursor.getString(column_index);
    }
}

NativeUtil.java代码如下:

/*
 * Copyright 2014 http://Bither.net
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package net.bither.util;

import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.util.Log;

public class NativeUtil {
    private static int DEFAULT_QUALITY = 95;

    public static void compressBitmap(Bitmap bit, String fileName,
            boolean optimize) {
        compressBitmap(bit, DEFAULT_QUALITY, fileName, optimize);

    }

    public static void compressBitmap(Bitmap bit, int quality, String fileName,
            boolean optimize) {
        Log.d("native", "compress of native");
        if (bit.getConfig() != Config.ARGB_8888) {
            Bitmap result = null;

            result = Bitmap.createBitmap(bit.getWidth(), bit.getHeight(),
                    Config.ARGB_8888);
            Canvas canvas = new Canvas(result);
            Rect rect = new Rect(0, 0, bit.getWidth(), bit.getHeight());
            canvas.drawBitmap(bit, null, rect, null);
            saveBitmap(result, quality, fileName, optimize);
            result.recycle();
        } else {
            saveBitmap(bit, quality, fileName, optimize);
        }

    }

    private static void saveBitmap(Bitmap bit, int quality, String fileName,
            boolean optimize) {
        compressBitmap(bit, bit.getWidth(), bit.getHeight(), quality,
                fileName.getBytes(), optimize);

    }

    private static native String compressBitmap(Bitmap bit, int w, int h,
            int quality, byte[] fileNameBytes, boolean optimize);

    static {
        System.loadLibrary("jpegbither");
        System.loadLibrary("bitherjni");

    }

}

main.xml布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="load"
        android:text="找图片" />

</LinearLayout>

布局里面放了一个button,点击进入图库选择图片,到activity中的onActivityResult中获取uri,然后调用nativeutil里面的方法。

  • 关于jni调用和ndk开发环境集成,这里就不说了,网上一大推~如果想详细查看的话c里面的代码可以到这里
Android 图片处理:编译和使用 libjpeg libjpeg 是一个广泛使用的库,用于在 Android 上进行 JPEG 图像的编解码。完成上述步骤后,你可以编译并运行你的 Android 项目。当你点击 “Compress Image” 按钮时,将会调用 JNI 接口,使用 libjpeg 库对输入的图像进行压缩,并将结果保存到输出路径中。通过这个库,你可以轻松地进行 JPEG 图像的编解码和处理。创建一个新的 Android 项目,或者在现有项目中添加 libjpeg 的支持。请确保在运行项目之前,将输入路径和输出路径替换为实际的图像文件路径。 阅读详情

相关推荐

libjpeg-turbo:Android平台JPEG图像处理优化指南

libjpeg-turbo是一个开源库,旨在提升JPEG图像处理的速度和性能。它基于libjpeg,但增加了SIMD(单指令多数据)技术的支持,使图像处理任务能更好地利用现代CPU的多核和向量化指令集。这使得libjpeg-turbo在处理速度上比原生libjpeg有显著的提升,同时保持了高度的兼容性。在智能手机和平板电脑领域,ARM架构的处理器因其低功耗、高性能而被广泛采用。而x86架构的处理器,则更多地用于PC和服务器。ARM和x86架构在指令集、执行效率、功耗等方面存在显著差异。

weixin_36173034的博客 1215

Android NDK开发中libjpeg-turbo、libpng、libwebp图像压缩库的使用方法(一)

文章允许转载,请注明来源:http://blog.youkuaiyun.com/feiniao8651/article/details/78620285 引言 gif,png,jpg,以及最近几年逐渐崛起的的webp,都是大家常见的图像格式。之前开发程序的时候,一般都是调用系统封装好的图像api,难得有机会在代码里直接调用这些库。最近在做项目过程中,使用这些库的时候,一直苦于没有一个全面完整的说明,需

高飞的专栏 2206

Android平台libjpeg库集成与应用实战

libjpeg是一个广泛使用的开源软件库,其主要功能是处理JPEG格式的图像数据。它支持JPEG图像的压缩、解压缩、查看、处理等多种操作,广泛应用于图像处理、网络传输、媒体存储等场景。libjpeg的特点包括高度优化的性能、易于使用的API、高度可定制性和广泛的应用支持。这些特点使得libjpeg成为了一个在图像处理领域中不可忽视的重要工具。libjpeg库由许多功能强大但相对简单的模块组成,这意味着开发者可以根据自己的需求,选择性的使用或者改进特定的模块。

weixin_42506884的博客 1227

Android_NDK图片压缩之Libjpeg库使用

欢迎加入技术谈论群:714476794一、前言Android图片压缩处理确实不如Ios,之前完全没听过libjpeg这个东西,工作闲余时间研究了了一天,总结下吧libjpeg的介绍可以参考文章:http://blog.youkuaiyun.com/talkxin/article/details/50696511二、编码前准备工作1、ndk环境搭建ndk工具包下载可以到http://www.androiddev...

hqiong208的博客 8444

Android使用的libjpeg库文件

可以用于Android下使用libjpeg。内部有arm x86 x64的静态库和头文件

jpeg图片提取缩略图代码,包含库文件linux直接编译运行

使用jpeglib 库提取缩略图,用于网络传输,linux可直接编译运行,编译加-I./my_jpeg/include/ -L./my_jpeg/lib ./my_jpeg/lib/libjpeg.a

使用libjpeg库实现jpeg图片的缩放(缩略图)

libjpeg库的交叉编译 libjpeg库主要用于jpeg格式图片的编解码,其交叉编译过程如下 1.  下载源码 从官方网站http://www.ijg.org/files/ 下载libjpeg库的源码,本次编译过程使用的是 jpegsrc.v9a.tar.gz 2. 解压源码 2.1 切换到下载目录,执行 tar -xzvf jpegsrc.v9a.tar.

qq160816的专栏 6590

Allegro PCB设计小技巧:如何用Shift键快速平移复制走线和过孔?

本文深入解析了Allegro PCB设计中利用Shift键进行平移复制的核心技巧。通过对比传统复制粘贴流程,详细演示了如何高效、精准地批量复制走线和过孔,尤其适用于创建等间距电源总线、过孔阵列等场景,能显著提升PCB设计效率与准确性。

pz89012345的博客 554

Android实战技巧之五十一:libjpeg与Android

libjpeg是一个被广泛使用的JPEG解码、JPEG编码和其他的JPEG功能的实现库。 说它使用广泛,是因为它跨了很多平台。比如Linux平台、JDK、Android和其他库如tess-two等等。最近正在研究Android中直接用C/C++将图片的字节数组保存成图片,libjpeg库十分擅长。 官网www.ijg.org下载最新的版本9b,解压后会看到数量众多makefile,足以见得其对多

懒人的技术笔记 1万+

从零开始搭建属于自己的语音识别API服务器(ASRT开源项目)

材料准备 云服务器 (本人使用的的是阿里云服务器 Ubuntu(Linux操作系统)) 环境搭建 1. Python 3.7 话不多说直接上代码 sudo su yum -y install git yum -y install gcc yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-deve

zhi_qian的博客 5648

5060TI显卡深度学习环境搭建:CUDA12.8与CUDNN9.8.0的完美搭配

本文详细介绍了在Win10系统下为5060TI显卡搭建深度学习环境的最佳实践,重点配置CUDA12.8与CUDNN9.8.0的完美组合。通过优化OpenCV编译选项和YOLOv5环境设置,显著提升模型训练和推理效率,帮助开发者充分发挥5060TI显卡的性能潜力。

weixin_29065791的博客 488

Android图片压缩库——libjpeg-turbo

为何Android图片压缩效率低

talkxin的博客 1万+

基于live555实现一个rtsp客户端程序

本文介绍了基于live555流媒体库实现的RTSP客户端程序,能够通过RTSP地址获取H.264/H.265裸码流或TS流数据并存入本地文件。详细阐述了使用CLion搭建工程的代码架构和CMake配置,重点分析了TS流解析模块的实现,包括TS包结构解析、PES包提取和ES裸流获取的完整流程。文章提供了TS/PES/ES三种数据包的协议说明,并给出了从TS流中提取视频帧的具体方法,最后附有工程代码下载链接。该方案实现了RTSP流媒体接收、解析和存储的完整功能链。

kk821521286的博客 790

Android libjpeg-turbo 项目使用教程

Android libjpeg-turbo 项目使用教程 1. 项目的目录结构及介绍 android-libjpeg-turbo/ ├── jni/ │ ├── vendor/ │ │ ├── libjpeg-turbo/ │ │ │ ├── Android.mk │ │ │ ├── include/ │ │ │ ├── libjpeg-turbo-...

gitblog_01160的博客 766

R语言笔记十:独立性检验函数

1.独立性检验函数        独立性检验是根据频数信息判断两类因子彼此相关或相互独立的假设检验。所谓独立性就是指变量之间是独立的,没有关系。 独立性检验算法:卡方检验、Fisher检验、Cochran-Mantel-Haenszel检验 2.假设检验 假设检验(Hypothesis Testing)是数理统计学中根据一定假设条件由样本推断总体的一种方法。 原假设——没有发生 备择假设——发生了 具体做法:根据问题的需要对所研究的总体作

weixin_44384631的博客 4111

基于STM32、HAL库的TLV320AIC3204IRHBR音频接口芯片驱动程序设计

* 开启所有数字部分 */#define TLV320AIC3204_REG_LEFT_HEADPHONE_OUT_VOLUME 0x0C /* 左声道耳机输出音量 */#define TLV320AIC3204_REG_DIGITAL_AUDIO_PATH_CONTROL 0x05 /* 数字音频路径控制 */#define TLV320AIC3204_REG_ANALOG_HP_FILTER_CONTROL 0x34 /* 模拟耳机滤波器控制 *//* 最大音量 */

corlin6688的博客 521

【亲测免费】 推荐开源项目:libjpeg-turbo-android-lib - 高性能JPEG处理库

`libjpeg-turbo-android-lib` 是一个专门为Android平台优化的JPEG图像编解码库,它基于`libjpeg-turbo`,旨在提供比原生`libjpeg`更快的速度和更低的功耗。该项目针对Android NDK进行了深度定制,为移动设备上的图像处理应用提供了强大的支持。 ## 项目技术分析 `libjpeg-turbo-android-lib` 利用了`Skia`...

gitblog_00069的博客 632

部署与可视化系统:移动端跟踪系统:YOLOv8 + ByteTrack 结合 Android CameraX 实现实时行人计数 App

本文详细介绍了在Android移动端实现实时行人检测、跟踪与计数系统的完整方案。系统采用YOLOv8+ByteTrack技术栈,基于NCNN推理引擎,无需云端算力即可在手机端侧完成全流程处理。文章从技术选型、系统架构、CameraX集成等多个维度进行深入解析,重点阐述了移动端部署面临的工程挑战和优化策略。通过四层管道模型设计,实现了从图像采集到目标跟踪的高效处理流程,并采用C++ NDK开发确保性能。该系统在中端手机上可达到10FPS,旗舰机型可达30FPS,为移动端实时目标跟踪提供了可落地的解决方案。

ZXSXJ的博客 91

Android实战技巧之五十一 libjpeg与Android

Android实战技巧之五十一 libjpeg与Android

yttyffggh的博客 1249

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Android使用libjpeg实现图片压缩

一、Android中使用的图片压缩库 Android和IOS 中图片处理使用了一个叫做skia的开源图形处理引擎。他位于android源码的/external/skia 目录。我们平时在java层使用一个图片处理的函数实际上底层就是调用了这个开源引擎中的相关的函数。 二、Android 中常用的压缩方式 Android中常用压缩方法分为2种:一种是降采样率压缩,另外一种是质量压缩。 代码:

BlueBerry的专栏 9314

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Android JPEG 压缩那些事

学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!最后如何才能让我们在面试中对答如流呢?答案当然是平时在工作或者学习中多提升自身实力的啦,那如何才能正确的学习,有方向的学习呢?有没有免费资料可以借鉴?为此我整理了一份Android学习资料路线:这里是一部分我工作以来以及参与过的大大小小的面试收集总结出来的一套BAT大厂面试资料专题包,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家。

2401_84123232的博客 1481

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

android仿微信高效压缩图片(libjpeg)

用过ios手机的同学应该很明显感觉到,ios拍照1M的图片要比安卓拍照排出来的5M的图片还要清晰。这是为什么呢? 这得了解android底层是如何对图片进行处理的. 当时谷歌开发Android的时候,考虑了大部分手机的配置并没有那么高,所以对图片处理是使用的Skia这个开源库。当然这个库的底层还是是用的jpeg对图片进行压缩处理。但是为了能够适配低端的手机(这里的低端是指以前的硬件配置不高的手机,C

hellozengms的博客 2986

Android 之使用libjpeg压缩图片

一、环境 Android Studio 4.0.1 NDK R15c so包是2.0.6生成的 libturbojpeg.so 二、准备 1、编写native方法并用javah命令生成头文件 object ImageUtil { private external fun compressBitmap(bitmap: Bitmap, quality: Int, fileName: String): Int fun compressImage(bitmap: Bitmap, q

万小凡的专栏 1113

简单处理Android 65536方法越界问题

看到这篇文章相信大家都是遇到了这个问题的人,对,Android著名的方法65536越界问题,是什么原因造成的呢? 这是因为在Android的单个dex文件中所能包含的最大方法数为65536,这个包含了Android FrameWork 、依赖jar包积极应用本身的代码中的所有方法;当我们的方法数总量达到了65536的话,编译器就会抛出类似下面的异常: Information:Gradle tas

RayXiong的博客 1685
上一篇: RxJava的入门和精通
下一篇: Js与本地代码的交互的一些用法
RayXiong
博客等级 码龄10年 8粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值