开发uniapp插件包aar文件,使uniapp可以调用jar包

背景

使用 uniapp 开发应用时,很多时候都需要调用第三方的sdk,一般以 jar 为主。为了应对这个问题,官方提供了插件方案,可以将第三方 jar 包进行封装为 aar 包后,再集成到 uniapp 中使用。

一、环境安装工具

1、jdk1.8环境(略)
2、Android studio官网下载 或者 Android Studio中文社区
3、Android studio安装教程
4、最新Android离线SDK下载
5、自有证书生成

二、基础工程准备

  1. 安装好android studio后,导入离线SDK中UniPlugin-Hello-AS安卓项目

    在这里插入图片描述

导入后,等待下载相关依赖,根据提示去补全sdk。确认没有错误后即可。

在这里插入图片描述
在这里插入图片描述

这里除了 app 之外的其他几个 module ,uniplugin_moduleuniplugin_componentuniplugin_rrichalert 是示例,都可以删除,你也可以留着参考。

如果删除这几个 module,则需要同时删除 app/build.grade 文件中的依赖和 app/src/main/assets/dcloud_uniplugins.json 中间中的内容,如下图所示:

在这里插入图片描述

在这里插入图片描述

三、创建组件

在项目根目录右击 New > Module > Android Library

在这里插入图片描述

在这里插入图片描述

到此,Module Library 创建完成。

此时刚刚创建完成后会出现编译错误 No signature of method: build_*.android() is applicable for argument types 或者 Package Name not found in xxxxxx,这是因为我们刚刚创建项目 AndroidManifest.xml 中没有 package 属性导致的,继续向下进行,下面会讲。

1)先编辑刚刚创建的这个组件目录中的 build.gradle 文件。在最后面找到 dependencies 节点,添加导入 libs 有关的两行配置,如下:

// 这个libs是指当前module往后退一层后app目录中的libs,那个libs中有uniapp-v8-release.aar文件
compileOnly fileTree(dir: '../app/libs', include: ['uniapp-v8-release.aar'])
// 这个libs是指当前module中的libs目录
implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: [])

**特别注意:**因为使用不同版本的 Android Studio 创建的 Module,生成的 build.gradle 里面的内容是可能不同的,这样可能会出现你这个 module 无法正常编译构建的问题,所以这里我建议复制一份 uniplugin_module 中的 build.gradle,再修改,下面是我的完整的 build.gradle 的内容:

apply plugin: 'com.android.library'android {
//    namespace 'com.example.myfirstlibrary'compileSdkVersion 29defaultConfig {minSdkVersion 16targetSdkVersion 28versionCode 1versionName "1.0"testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
//        consumerProguardFiles "consumer-rules.pro"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}
}repositories {flatDir {dirs 'libs'}
}dependencies {// 这个libs是指当前module往后退一层后app目录中的libs,那个libs中有uniapp-v8-release.aar文件compileOnly fileTree(dir: '../app/libs', include: ['uniapp-v8-release.aar'])// 这个libs是指当前module中的libs目录implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: [])compileOnly 'androidx.appcompat:appcompat:1.0.0'/*implementation 'com.google.android.material:material:1.12.0'testImplementation 'junit:junit:4.13.2'androidTestImplementation 'androidx.test.ext:junit:1.1.5'androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'*/
}

在这里插入图片描述

2)编辑当前创建的 module 中的 AndroidManifest.xml,添加 package 属性,如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.myfirstlibrary"></manifest>

在这里插入图片描述

如未配置 package 属性,会出现编译错误 Package Name not found in xxxxxx UniPlugin-Hello-AS\myfirstlibrary\src\main\AndroidManifest.xml

3)添加第三方 jar 包和对应依赖

将第三方 jar 包拷贝到 libs 目录中,如果该 jar 包需要依赖其他 jar 包,你可以选择将相关依赖的 jar 包都拷贝到 libs中,或者在 build.grade 的 dependencies 中添加依赖,最后点击右上角的 Sync Now 刷新依赖。

本例导入一个第三方的 jar包来演示对字符串进行处理测试,导入 jar 包后的截图如下:

在这里插入图片描述

4)在 src > main > java 的包中,新建测试的 Java类,继承io.dcloud.feature.uniapp.common.UniModule,然后在里面编写自己的业务逻辑代码。

在这里插入图片描述

package com.example.myfirstlibrary;import net.iharder.Base64;import java.io.IOException;import io.dcloud.feature.uniapp.annotation.UniJSMethod;
import io.dcloud.feature.uniapp.bridge.UniJSCallback;
import io.dcloud.feature.uniapp.common.UniModule;/*** 继承 UniModule 并在需要被 uniapp 调用的方法上添加 @UniJSMethod 注解* <p>* UniJSMethod 中的 uiThread 属性决定了被标记的方法是否在主线程(UI 线程)中执行。* uiThread = true: 当 uiThread 设置为 true 时,标记的方法将在 UI 线程中执行。UI 线程是负责处理用户界面更新的线程,因此,如果方法涉及到 UI 更新、视图操作等,应该在 UI 线程中执行。否则,在非 UI 线程中进行这些操作会导致异常。* uiThread = false: 当 uiThread 设置为 false 时,标记的方法将在后台线程中执行。这适用于耗时操作、IO 操作或需要在后台完成的任务,不会阻塞 UI 线程。*/
public class HelloUniappModule extends UniModule {/*** 测试加密字符串** @param str      参数* @param callback js回调*/@UniJSMethodpublic void testEncodeStr(String str, UniJSCallback callback) {if (callback != null) {String result = Base64.encodeBytes(str.getBytes());callback.invoke(result);}}@UniJSMethodpublic void decodeBase64(String encodedStr, UniJSCallback callback) throws IOException {if (callback != null) {byte[] decodedBytes = Base64.decode(encodedStr);callback.invoke(new String(decodedBytes));}}}

三、配置插件

1、文件 app/src/main/assets/dcloud_uniplugins.json,添加内容如下:

{"nativePlugins": [{"plugins": [{"type": "module","name": "My-First-Plugin","class": "com.example.myfirstlibrary.HelloUniappModule"}]}]
}

2、文件 app/build.grade 添加插件

在这里插入图片描述

四、打包插件

在这里插入图片描述

默认情况下打包是 debug 打包,生成的 aar 文件中也包含 debug 字样,我们最终使用还是希望使用 release 正式版,并且正式版本你可能做了混淆或者压缩对其等处理(具体配置可以在 build.gradle 文件的 buildTypes 块中配置。

如果希望进行 release 打包,如下图所示操作即可:

在这里插入图片描述

切换 buildType 后,再执行构建,生成的包就是对应类型的文件了。

在这里插入图片描述

最后,将这个 aar 文件拷贝出来添加到 uniapp 代码工程里使用,至于如何在 uniapp 中集成并使用 aar 文件,本文不做赘述。

官方文档: 开发者须知 | uni小程序SDK
参考资料:uniapp调用Java库 | uniapp使用第三方jar


(END)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/856738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言练习02-数组

一、求最值 已知数组元素为{33,5,22,44,55}&#xff0c;找出数组中的最大值并打印在控制台 #include<stdio.h> #include<math.h>int main() {int arr[] {33,5,22,44,55};int max arr[0];int len sizeof(arr) / sizeof(int); //注意&#xff1a;sizeof(arr)计算…

【无线传感网】分簇路由算法介绍

目录 1、LEACH路由算法 2、PEGASIS 算法 3、TEEN 算法 5、APTEEN 5、LEACH-C 算法 无线传感网中的路由协议就是寻找一条路径让网络中节点沿着这条路径将数据信息传输出去。路由协议的两大关键要点就是路径的优化和数据的分组,在传统计算机网络中,是将网络的拓扑…

Linux系统安装Dify结合内网穿透实现远程访问本地LLM开发平台

文章目录 前言1. Docker部署Dify2. 本地访问Dify3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 前言 本文主要介绍如何在Linux Ubuntu系统使用Docker快速部署大语言模型应用开发平台Dify,并结合cpolar内网穿透工具实现公网环境远程访问…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] API集群访问频次统计(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

Python酷库之旅-第三方库openpyxl(01)

目录 一、 openpyxl库的由来 1、背景 2、起源 3、发展 4、特点 4-1、支持.xlsx格式 4-2、读写Excel文件 4-3、操作单元格 4-4、创建和修改工作表 4-5、样式设置 4-6、图表和公式 4-7、支持数字和日期格式 二、openpyxl库的优缺点 1、优点 1-1、支持现代Excel格式…

前端基础操作1——利用nvm任意切换(管理)node版本

在实际前端项目开发过程中&#xff0c;同时开发多个项目或者切换新项目时&#xff0c;因为node版本问题造成项目无法运行的问题比比皆是&#xff0c;这时候通过nvm管理切换不同版本的node&#xff0c;就能很快进入开发模式&#xff0c;避免因为环境问题浪费大量精力&#xff0c…

安卓系统安装linux搭建随手服务器termux平替软件介绍

引言 旧手机丢可惜&#xff0c;可以用ZeroTermux&#xff08;一款代替termux&#xff09;的超级终端&#xff0c;来模拟Linux&#xff08;甚至你可以模拟Win&#xff0c;只要性能够用&#xff09; ps&#xff1a;此软件只是termux的增强版&#xff0c;相当于增加右边菜单&…

校园任务平台系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;论坛管理&#xff0c;任务咨询管理&#xff0c;用户管理&#xff0c;基础数据管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;任务资讯公告&#…

AGI的多模态融合

在人工智能的宏伟蓝图中&#xff0c;人工通用智能&#xff08;AGI&#xff09;代表着一个集大成者&#xff0c;一个能够理解、学习、适应并执行任何智能任务的系统。随着我们对AGI的探索愈发深入&#xff0c;尤其是在视觉、语言和其他模态的融合上&#xff0c;关于AGI的讨论愈发…

图像分割(三)-RGB转HSV后图像分割方法

常用彩色模型有RGB和HSV模型&#xff0c;有时候在RGB颜色空间进行背景分割比较困难的问题&#xff0c;转换为HSV模型然后对色调和饱和度图像进行处理会得到比较理想的处理结果,下面通过一个实例讲解该方法的MATLAB实现&#xff0c;该方法对其他图像检测也具有一定的参考价值。 …

React路由笔记(函数组件,自用)

配置 npm i react-router-dom基本使用 目录结构 在src中创建page文件夹放置各页面组件&#xff0c;router中放置路由 1、router中配置路由 在/router/index.js中&#xff0c;使用createBrowserRouter配置路由。 import { createBrowserRouter } from "react-router…

Pure Nature 2 : Mountains

3D样式化的自然环境资源 所有东西都配有预制件,随时可以放在现场。 包含URP版本! 此包包含: 植被 -云杉 -松树 -冷杉 -布什 -蘑菇 -草地 草,树枝,蕨类植物,各种… -鲜花 浆果,胡萝卜,雏菊,浓香,薰衣草,羽扇豆,各种… -蘑菇 岩石 -悬崖 -巨石 -岩石和卵石 -山脉 材料…

webp动图转gif

目录 前言 解决过程 遇到问题 获取duration 前言 上一次我们实现了webp转jpg格式&#xff1a; https://blog.csdn.net/weixin_54143563/article/details/139758200 那么对于含动图的webp文件我们如何将其转为gif文件呢&#xff1f; 之所以会出现这个问题&#xff0c;是因…

【python】PyQt5初体验,窗口等组件开发技巧,面向对象方式开发流程实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

【漏洞复现】红帆iOffice.net wssRtSyn接口处存在SQL注入

【产品&&漏洞简述】 红帆iOffice.net从最早满足医院行政办公需求&#xff08;传统OA&#xff09;&#xff0c;到目前融合了卫生主管部门的管理规范和众多行业特色应用&#xff0c;是目前唯一定位于解决医院综合业务管理的软件&#xff0c;是最符合医院行业特点的医院综…

MyBatis 动态 SQL怎么使用?

引言&#xff1a;在现代的软件开发中&#xff0c;数据库操作是任何应用程序的核心部分之一。而在 Java 开发领域&#xff0c;MyBatis 作为一款优秀的持久层框架&#xff0c;以其简洁的配置和强大的灵活性被广泛应用。动态 SQL 允许开发人员根据不同的条件和场景动态地生成和执行…

【机器学习300问】127、怎么使用词嵌入?

在探讨如何使用词嵌入之前&#xff0c;我们首先需要理解词嵌入模型的基础。之前的文章已提及&#xff0c;词嵌入技术旨在将文本转换为固定长度的向量&#xff0c;从而使计算机能够解析和理解文本内容。可以跳转下面链接去补充阅读哦&#xff01; 【机器学习300问】126、词嵌入…

会声会影2024旗舰版汉化最新安装包下载方法步骤

嗨&#xff0c;亲爱的CSDN的朋友们&#xff01;&#x1f389;今天&#xff0c;我要跟大家分享一款让你的视频编辑体验升级的神器——会声会影2024最新版本&#xff01;✨如果你是一个热衷于创作视频内容的创作者&#xff0c;那么你一定不能错过这个软件。它不仅功能强大&#x…

一款Wordpress网站导航主题,带昼夜切换功能

Wordpress网站导航主题&#xff0c;带昼夜切换功能。 基于wordpress&#xff0c;部署和使用都比较方便。 界面比较简洁大方。后台管理功能也比较全面&#xff0c;值得一试。 这款主题界面、功能都非常简洁。 作者把这款定位为简约导航主题&#xff0c;所以这款wordpress导航…

uniapp小程序获取右上角胶囊位置信息

文章目录 导文使用uni.getMenuButtonBoundingClientRect();方法实现完整案例 隐藏默认导航栏&#xff1a;全局隐藏当前页面隐藏 导文 uniapp小程序获取右上角胶囊位置信息 使用uni.getMenuButtonBoundingClientRect();方法实现 <script>const menuButtonInfo uni.getMe…