Js与本地代码的交互的一些用法

WPF WebBrowser控件的详细使用教程 添加WebBrowser控件:通过 XAML 或代码-behind 将WebBrowser控件添加到应用程序中。加载网页:使用Navigate方法加载 URL,或通过加载 HTML 内容。处理事件:利用NavigatingNavigated和等事件来处理网页导航过程。与 JavaScript 交互:调用 JavaScript 函数或接收 JavaScript 调用,通过实现。进阶功能:处理本地文件、下载和安全设置等。WebBrowser。 阅读详情

js和本地交互

最近项目要求用js和本地交互,所以就去看了下webview的一些api,发现只能满足一些简单的需求,而项目里面的需求是比较多的而且要用的功能也算有点复杂,所以想想去githup搜索了下,有大神已经把这些东西封装好了。基本能满足大部分需求了。接下来说下他的用法,只是用他的源码需要把WebViewJavascriptBridge.js这文件拷贝到你的assets资源文件目录下,这个类里面自己封装了一些用于消息处理的方法。看下他的项目结构这里写图片描述在model里面就是一个user实体了,后面有用到,接着看MainActivity.java

package com.lyk.jsbridge;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.widget.Toast;

import com.github.lzyzsd.jsbridge.BridgeHandler;
import com.github.lzyzsd.jsbridge.BridgeWebView;
import com.github.lzyzsd.jsbridge.BridgeWebViewClient;
import com.github.lzyzsd.jsbridge.CallBackFunction;
import com.github.lzyzsd.jsbridge.DefaultHandler;
import com.google.gson.Gson;
import com.lyk.jsbridge.modle.User;

public class MainActivity extends AppCompatActivity {

    private BridgeWebView mWebView;

    ValueCallback<Uri> mUploadMessage;

    int RESULT_CODE = 0;

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        mWebView = (BridgeWebView) findViewById(R.id.webView);
        initWebView();
    }

    private void initWebView() {
        // 设置具体WebViewClient
        mWebView.setWebViewClient(new MyWebViewClient(mWebView));
        // set HadlerCallBack
        mWebView.setDefaultHandler(new myHadlerCallBack());
        // setWebChromeClient
        mWebView.setWebChromeClient(new WebChromeClient() {

            @SuppressWarnings("unused")
            public void openFileChooser(ValueCallback<Uri> uploadMsg, String AcceptType, String capture) {
                this.openFileChooser(uploadMsg);
            }

            @SuppressWarnings("unused")
            public void openFileChooser(ValueCallback<Uri> uploadMsg, String AcceptType) {
                this.openFileChooser(uploadMsg);
            }

            public void openFileChooser(ValueCallback<Uri> uploadMsg) {
                mUploadMessage = uploadMsg;
                pickFile();
            }
        });

        mWebView.loadUrl("file:///android_asset/demo.html");

        //必须和js函数名字一致,注册好具体执行回调函数,类似java实现类。
        mWebView.registerHandler("submitFromWeb", new BridgeHandler() {

            @Override
            public void handler(String data, CallBackFunction function) {

                String str = "这是html返回给java的数据:" + data;
                // 例如你可以对原始数据进行处理
                str = str + ",Java经过处理后截取了一部分:" + str.substring(0, 5);
                Log.i(TAG, "handler = submitFromWeb, data from web = " + data);
                Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();
                //回调返回给Js
                function.onCallBack(str + ",Java经过处理后截取了一部分:" + str.substring(0, 5));
            }

        });

        mWebView.registerHandler("functionOpen",  new BridgeHandler() {

            @Override
            public void handler(String data, CallBackFunction function) {
                Toast.makeText(MainActivity.this, "网页在打开你的下载文件预览", Toast.LENGTH_SHORT).show();
                pickFile();

            }

        });
        //模拟用户信息 获取本地位置,用户名返回给html
        User user = new User();
        user.setLocation("上海");
        user.setName("Bruce");
        // 回调 "functionInJs"
        mWebView.callHandler("functionInJs", new Gson().toJson(user), new CallBackFunction() {
            @Override
            public void onCallBack(String data) {

                Toast.makeText(MainActivity.this, "网页在获取你的位置,"+ data, Toast.LENGTH_SHORT).show();

            }
        });
        mWebView.send("hello");
    }

    /**
     * 自定义的WebViewClient
     */
    class MyWebViewClient extends BridgeWebViewClient {

        public MyWebViewClient(BridgeWebView webView) {
            super(webView);
        }
    }


    /**
     * 自定义回调
     */
    class myHadlerCallBack extends DefaultHandler {

        @Override
        public void handler(String data, CallBackFunction function) {
            if(function != null){

                Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show();
            }
        }
    }

    public void pickFile() {
        Intent chooserIntent = new Intent(Intent.ACTION_GET_CONTENT);
        chooserIntent.setType("image/*");
        startActivityForResult(chooserIntent, RESULT_CODE);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        if (requestCode == RESULT_CODE) {
            if (null == mUploadMessage) {
                return;
            }
            Uri result = intent == null || resultCode != Activity.RESULT_OK ? null : intent.getData();
            mUploadMessage.onReceiveValue(result);
            mUploadMessage = null;
        }
    }

}
  • js里面的代码:
html>
<head>
    <meta content="text/html; charset=utf-8" http-equiv="content-type">
    <title>
        js调用java
    </title>
</head>

<body>
<p>
    <xmp id="show">
    </xmp>
</p>
<p>
    <xmp id="init">
    </xmp>
</p>
<p>
    <input type="text" id="text1" value="用户名(username)"/>
</p>

<p>
    <input type="text" id="text2" value="password"/>
</p>

<p>
    <input type="button" id="enter" value="发消息给Native" onclick="testClick();"
            />
</p>

<p>
    <input type="button" id="enter1" value="调用Native方法" onclick="testClick1();"
            />
</p>

<p>
    <input type="button" id="enter2" value="显示源代码" onclick="testDiv();"/>
</p>

<p>
    <input type="file" id="open" value="打开文件" onclick="onOpen();"/>
</p>
</body>
<script>

        function onOpen() {
           var str1 = document.getElementById("text1").value;
            var str2 = document.getElementById("text2").value;
            var data = "name=" + str1 + ",pass=" + str2;
            //call native method


            window.WebViewJavascriptBridge.callHandler(
                'functionOpen'
                , {'param': data }
                , function(responseData) {
                    //document.getElementById("show").innerHTML = "send get responseData from java, data = " + responseData;


                }
            );
        }
        function testDiv() {
            document.getElementById("show").innerHTML = document.getElementsByTagName("html")[0].innerHTML;
        }
        function testClick() {
            var str1 = document.getElementById("text1").value;
            var str2 = document.getElementById("text2").value;
            //发送消息给java本地代码
            var data = {id: 1, content: "这是一个图片 <img src=\"a.png\"/> test\r\nhahaha"};
            window.WebViewJavascriptBridge.send(
                data
                , function(responseData) {
                    document.getElementById("show").innerHTML = "repsonseData from java, data = " + responseData
                }
            );
        }
        function testClick1() {
            var str1 = document.getElementById("text1").value;
            var str2 = document.getElementById("text2").value;
            var data = "name=" + str1 + ",pass=" + str2;
            //call native method
            window.WebViewJavascriptBridge.callHandler(
                'submitFromWeb'
                , {'param': data }
                , function(responseData) {
                    document.getElementById("show").innerHTML = "send get responseData from java, data = " + responseData
                }
            );
        }
        function bridgeLog(logContent) {
            document.getElementById("show").innerHTML = logContent;
        }
        function connectWebViewJavascriptBridge(callback) {
            if (window.WebViewJavascriptBridge) {
                callback(WebViewJavascriptBridge)
            } else {
                document.addEventListener(
                    'WebViewJavascriptBridgeReady'
                    , function() {
                        callback(WebViewJavascriptBridge)
                    },
                    false
                );
            }
        }
       // 第一连接时初始化bridage
        connectWebViewJavascriptBridge(function(bridge) {
            bridge.init(function(message, responseCallback) {
                console.log('JS got a message', message);
                var data = {
                    'Javascript Responds': '测试中文!'
                };
                console.log('JS responding with', data);
                responseCallback(data);
            });
            // 注册一个"functionInJs",
            bridge.registerHandler("functionInJs", function(data, responseCallback) {

                document.getElementById("show").innerHTML = ("data from Java: = " + data);
                var responseData = "Javascript Says  我要你的地址!";
                // response层
                responseCallback(responseData);
            });
        })
        bridge.init(function(message, responseCallback) {
        console.log('JS got a message', message);
        var data = {
            'Javascript Responds': 'Wee!'
        };
        console.log('JS responding with', data);
        responseCallback(data);
    });

</script>

</html>

首先看下js里面的代码,可以看到有button,对应俩个点击事件onclick(),onclick1(); 再看下面的代码找到这个俩个方法的实现,

//第一个实现
function testClick() {
            var str1 = document.getElementById("text1").value;
            var str2 = document.getElementById("text2").value;
            //发送消息给java本地代码
            var data = {id: 1, content: "这是一个图片 <img src=\"a.png\"/> test\r\nhahaha"};
            window.WebViewJavascriptBridge.send(
                data
                , function(responseData) {
                    document.getElementById("show").innerHTML = "repsonseData from java, data = " + responseData
                }
            );
        }
//这里是第二个实现
        function testClick1() {
            var str1 = document.getElementById("text1").value;
            var str2 = document.getElementById("text2").value;
            var data = "name=" + str1 + ",pass=" + str2;
            //call native method
            window.WebViewJavascriptBridge.callHandler(
                'submitFromWeb'
                , {'param': data }
                , function(responseData) {
                    document.getElementById("show").innerHTML = "send get responseData from java, data = " + responseData
                }
            );
        }

可以看到俩个方法里面都有
//call native method
window.WebViewJavascriptBridge.callHandler(
‘submitFromWeb’之类的写法,这里就是开始调用本地的方法,注释里面写的很清楚,注意这里的单引号的字符串就是对应java中的别名,所以只要到java本地代码中去看看,找到这别名就知道他的调用了。go~go~go!


        //必须和js函数名字一致,注册好具体执行回调函数,类似java实现类。
        mWebView.registerHandler("submitFromWeb", new BridgeHandler() {

            @Override
            public void handler(String data, CallBackFunction function) {

                String str = "这是html返回给java的数据:" + data;
                // 例如你可以对原始数据进行处理
                str = str + ",Java经过处理后截取了一部分:" + str.substring(0, 5);
                Log.i(TAG, "handler = submitFromWeb, data from web = " + data);
                Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();
                //回调返回给Js
                function.onCallBack(str + ",Java经过处理后截取了一部分:" + str.substring(0, 5));
            }

        });

找到了,上面的代码就是到这webview 标上’submitFromWeb’别名,注册一个回调,看注释,其中data是点击js中的button给我的数据,而就是通过这个类CallBackFunction 将本地java的数据回调给js的: function.onCallBack(str + “,Java经过处理后截取了一部分:” + str.substring(0, 5)); 一定要注意这里的别名一定要写的跟js中的一致,不然找不到的,关于原理,其实是他内部用了一个结合将这个别名和接口装载,然后js获取的时候会根据这别名找到对应的接口也就是这个BrigeHandler,然后回调里面的数据,要弄清楚里面的细节可以自己看源码,这个过程就是js调用本地的一种,再看看本地调用js的。

 //模拟用户信息 获取本地位置,用户名返回给html
        User user = new User();
        user.setLocation("上海");
        user.setName("Bruce");
        // 回调 "functionInJs"
        mWebView.callHandler("functionInJs", new Gson().toJson(user), new CallBackFunction() {
            @Override
            public void onCallBack(String data) {

                Toast.makeText(MainActivity.this, "网页在获取你的位置,"+ data, Toast.LENGTH_SHORT).show();

            }
        });
        mWebView.send("hello");

然后找到js中别名部分的代码:

// 注册一个"functionInJs",
            bridge.registerHandler("functionInJs", function(data, responseCallback) {

                document.getElementById("show").innerHTML = ("data from Java: = " + data);
                var responseData = "Javascript Says  我要你的地址!";
                // response层
                responseCallback(responseData);
            });

注释非常清楚,可以看的出来,本地java将一个data user数据传过去了,而js中通过responseCallback回调给本地的数据,这就是一个回调的过程,自己看注释,还是非常容易理解掌握的~!

好了,今天,就先到这里~大家有问题可以发我邮箱(593769469@qq.com)或者留言。

Android与HTML+JS交互入门 在Android开发中,越来越多的商业项目使用了Android原生控件与WebView进行混合开发,当然不仅仅就是显示一个WebView那么简单,有时候还需要本地Java代码与HTML中的javascript进行交互,Android也对交互做了很好的封装,所以很容易实现例如:点击网页中的按钮Android调用原生对话框,点击网页中的电话号码调用Android拨号APP。这篇给大家介绍下如何实现An 阅读详情

相关推荐

Android 与JS交互 调用本地相册在Html页面显示图片

Android 与JS交互浅谈Android 与 JS 交互主要分为: JS 调用Android中的方法 Android首先要用WebView加载Html页面 -mWebView.getSettings().addJavascriptInterface(new DemoJavascriptInterface(), “network”); mWebView.loadUrl();就可实现加载Htm

hukaiguo的博客 1万+

pc前端js调起电脑本地应用程序(需要客户端配合 自定义URL Protocol 协议 )

由于做项目需要实现如题的一个功能,所以搜寻了相关资料。 优快云博文 自定义URL Protocol(客户端的配置):http://blog.youkuaiyun.com/chinahaerbin/article/details/8783024 项目地址:https://github.com/li1164267803/pc-call-up-client 包含html和在vue中的使用方法 如果觉得对您有用,不忘记了给个 star 前端的工作 <!DOCTYPE html> <htm..

希文Gershwin 9989

QT与JavaScript交互 Qt调用JS脚本_qt js

/页面加载完成qDebug()

2401_87556757的博客 1923

js java通信_JavaScript与Java通信

1、WebView中JavaScript调用Android程序中Java:使用WebView类中的addJavascriptInterface()方法,可以使用它扩展嵌入式浏览器内的DOM(文档对象模型),并定义JavaScript代码可以访问的新对象。JavaScript代码调用该对象的方法时,实际上它会调用Android程序中的方法。2、在Android程序中调用JavaScript方法:调用...

weixin_39575850的博客 195

WPS JS宏智能识别代码段并设置样式(完整可用版)

之前,我们已经经历了多次迭代,解决了许多问题,比如识别代码块、处理多行导入、调整样式等。现在他们需要一份全面的文档来解释整个代码的结构和工作原理。(5)智能行分析(含URL和注解检测优化)function analyzeLineEnhanced(rawText,trimmedText,codeSymbols,codePatterns, singleLinePatterns)该解决方案在保持高性能的同时,提供了良好的可扩展性,能够适应不同组织的代码规范需求,是WPS生态中专业文档处理的创新实践。

搏博的专栏 1823

MCP协议桥接AdsPower:AI原生时代的浏览器自动化新范式

浏览器自动化是Web开发和数据采集领域的核心技术,其核心原理是通过程序控制浏览器内核执行页面导航、元素交互和数据提取等操作。传统方案如Selenium和Playwright虽功能强大,但在管理多实例、指纹隔离等复杂场景下,配置和维护成本较高。随着AI原生应用的发展,Model Context Protocol(MCP)作为一种标准化协议,为AI助手与外部工具间的通信提供了统一接口,显著提升了自动化流程的构建效率和自然语言交互能力。通过MCP Server桥接AdsPower指纹浏览器的本地API,开发者可将

weixin_30552811的博客 296

js打开客户端程序及文件并传递参数

一.新建txt文件,复制下面代码 自定义协议universalLinks(可修改)二.js 调用协议。

tiantang__的博客 3659

Palantir解密:“本体”的建模逻辑及其扩展方向

上一篇重点从对现实世界建模的角度探讨了“本体”在数字化架构中的核心意义。这里借Palantir的“本体”概念、解析Palantir只是起点,目标旨在以他山之石攻玉——探索数字世界的底层架构逻辑,最终为构建自主体系提供思考。Palantir以“本体论”为核心的建模方案是否代表终极答案,不宜过早下结论,但其思路值得深入剖析。

SZSDQJC的博客 2635

8 (phonegap源码分析)JS与本地代码交互(exec )

这里采用的是较早版本的phonegap框架中exec模块的实现,代码比较直观易懂,后来的版本为了提升代码的健壮性,增加了很多选择性代码。为了测试方便,直接使用简单版本的exec模块。更高版本的phonegap库也是在这个基础之上扩展的,可对比学习。 define("myphonegap/exec", function(require, exports, module) { /**

zhang1314wen2008的专栏 953

Pytorch中CrossEntropyLoss()详解

交叉熵主要是用来判定实际的输出与期望的输出的接近程度。举个例子:在做分类训练的时候,如果一个样本属于第 K 类,那么这个类别所对应的输出节点的输出值应该为1,而其他节点的输出都为0,即 [0,0,1,0,….0,0] ,这个数组也就是样本的 Label,是神经网络最期望的输出结果。我们用交叉熵损失函数来衡量网络的实际输出与正确标签的差异,利用这种差异经过反向传播去更新网络参数。交叉熵:它主要刻画的是实际输出(概率)与期望输出(概率)的距离,也就是交叉熵的值越小,两个概率分布就越接近。

flyingluohaipeng的博客 3861

YOLO系列算法改进 | C3k2改进篇 | 融合DEConv细节增强卷积模块 | 细节增强+多分支差分卷积融合,标准卷积的完美涨点替代! | TIP 2024

YOLO系列算法改进 | C3k2改进篇 | 融合DEConv细节增强卷积模块 | 细节增强+多分支差分卷积融合,标准卷积的完美涨点替代! | TIP 2024 (以YOLO26最新目标检测模型为基础,融合C3k2_DEConv创新模块进行改进)

2502_91881744的博客 310

WebView使用详解(一)——Native与JS相互调用(附JadX反编译)

念念不忘,必有回响,永远坚持你所坚持的! 一直在用WebView,还没有系统的总结过它的用法,下面就系统的总结下,分享给大家 一、基本用法 1、加载在线URL void loadUrl(String url) 这个函数主要加载url所对应的网页地址,或者用于调用网页中的指定的JS方法(调用js方法的用法,后面会讲),但有一点必须注意的是:loadUrl()必须在主线程中执行!!!否则就会报错!!...

weixin_34119545的博客 96

LLM Wiki 的完整输入体系:LLM Wiki极简实战

LLM Wiki 的输入分为**四大类**,覆盖从"原始知识注入"到"系统行为控制"的全流程,所有输入都遵循"**原始资料不可变,规则可迭代,人类反馈闭环**"的核心原则。

ZhangJiqun&191cm&85kg 321

swift-UISegmentedControl和UIWebView的用法

它们是iOS应用中常用的界面元素,可以帮助您实现用户友好的交互和显示Web内容。在事件处理程序中,可以根据所选分段执行不同的操作。是两个常用的用户界面组件,分别用于创建分段控制器和显示Web内容。允许用户导航到前一页和后一页,类似于浏览器的前进和后退按钮。的属性来自定义其外观和行为,例如是否启用缩放、是否显示滚动条等。可以设置代理,以便处理诸如页面加载、链接点击等事件。方法,您可以执行JavaScript代码并获取结果。协议中的方法,可以拦截这些事件并执行相应的操作。也可以在代码中创建它,使用。

wqi9585的博客 298

Python爬虫实战:采集菜谱网站数据——以“下厨房”为例

随着互联网的发展,海量优质数据为各类应用提供了坚实基础。菜谱作为用户日常生活中需求极高的内容,丰富多样的菜谱数据不仅方便用户烹饪,也为美食推荐、营养分析等研究提供了数据支持。本文将围绕国内知名菜谱网站“下厨房”(https://www.xiachufang.com)展开,结合最新Python爬虫技术,详细讲解如何高效、规范地采集菜谱数据,包括菜谱名称、食材、步骤、评分、评论等丰富信息。全篇覆盖爬虫原理、框架选型、反爬应对、数据存储和简单分析,是学习爬虫实战的绝佳案例。菜谱标题作者信息菜谱图片。

2201_76125261的博客 1899

18.EC实战 新建项目工程并配置各个引脚的工作方式(持续更新)

本博文介绍了从零开始新建EC工程及对各个引脚进行了工作模式的初始化配置

qq_30135687的博客 1731

蓝易云 - swift-UISegmentedControl和UIWebView的用法

它们是iOS应用中常用的界面元素,可以帮助您实现用户友好的交互和显示Web内容。在事件处理程序中,可以根据所选分段执行不同的操作。是两个常用的用户界面组件,分别用于创建分段控制器和显示Web内容。允许用户导航到前一页和后一页,类似于浏览器的前进和后退按钮。的属性来自定义其外观和行为,例如是否启用缩放、是否显示滚动条等。可以设置代理,以便处理诸如页面加载、链接点击等事件。方法,您可以执行JavaScript代码并获取结果。协议中的方法,可以拦截这些事件并执行相应的操作。也可以在代码中创建它,使用。

高性价比服务器就选:蓝易云 272

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

android webview与js交互(动态添加js)

Toast.makeText(mContxt, “调用funFromAndroid:” + name, Toast.LENGTH_LONG).show();Toast.makeText(MainActivity.this, “js加载失败”, Toast.LENGTH_SHORT).show();注:此例为本地html与本地js交互,如想在本地html添加js,将js.js代码复制到html对应标签内即可。一、本地html与本地js交互(本地html引用本地js)读取js添加到String 类型中。

2501_90499563的博客 1486

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

java与js交互_本地java代码和javascript进行交互(java和js互调)

在android的开发过程中,有很多时候需要用到本地java代码和javascript进行交互。android对交互进行了很好的封装,在开发中我们可以很简单的用java代码调用webview中的js,也可以用webview中的js来调用本地的java代码,这样我们可以实现很多原来做不了的功能,比如点击网页上的电话号码后,手机自动拨打电话,点击网页中的笑话,自动发送短信等.废话不多说,这次教程的目标...

weixin_30459905的博客 720

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

WebView与JS的交互

WebView与JS的交互

m0_62787113的博客 2451

使用WebView中的Javascript和本地代码交互

使用WebView中的Javascript和本地代码交互

1250

Android与javascript交互

android与js交互分两种情形: 1. android调用js代码 2. js调用android代码 首先介绍android调用HTML中的js代码,android中的WebView可以很好的完成android与js之间的交互工作。下面例子通过使用WebView加载本地的HTML文件实现与js的交互。 我们将本地HTML文件放在assets目录里面 //给android调

github_2011的博客 1595

WebView与js交互总结

【参考:】 Android webview与js 交换JSON对象数据 使用Kotlin:让Android与JS交互的详解 js中eval()的使用说明 简介 使用 WebView 加载网页,有时候需要进行js交互,相互传递数据和响应事件。 android 调用 js 代码: WebView#loadUrl("javascript:func('" + arg + "')") WebView#evaluateJavascript(String script, @Nullable ValueCallbac

wandryoung的博客 1970
上一篇: 最简单的ndk调用!通过libjpeg库来加载图片,避免了oom~
RayXiong
博客等级 码龄10年 8粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值