制作uniapp原生插件 在本地离线打包中测试 集成在云打包中

1.HBuilder X版本

2.Android Studio 版本

3.导入我提供的 HBuilder-Integrate-AS 工程,这个工程是根据uniappSDK中的同名工程扩展来的

uniappSDK下载地址 https://nativesupport.dcloud.net.cn/AppDocs/download/android.html

4.

5.先测试simpleDemo项目可以正常跑通在手机上,在开发arr原生插件,在将插件放在simpleDemo中本地离线打包,测试arr插件功能是否正常,在将arr插件复制到uniapp项目中,测试云打包后arr插件是否正常

6.运行simpleDemo项目,文档地址 https://nativesupport.dcloud.net.cn/AppDocs/usesdk/android.html

7.开发arr原生插件

在我提供的压缩包HBuilder-Integrate-AS 工程内,因为运行simpleDemo模块和AeroFFmpegModule模块所需要的gradle版本不一样,gradle8.x不能使用fat-aar包,fat-aar的功能是在运行AeroFFmpegModule模块时,可已加载本地的其他arr模块,并可打包进咱们自己制作的aar原生插件中,gradle8.x不能这样做,但是运行simpleDemo模块又需要gradle8.x的环境,所以需要切换

如果运行simpleDemo模块

项目根目录的 settings.gradle 文件内容

复制代码
//如果打包aar插件(AeroFFmpegModule模块就是一个aar模块),需要将 //include ':simpleDemo' 这行注释
//如果本地离线打包uniapp项目并测试自己制作的aar模块,需要将 //include ':AeroFFmpegModule' 这行注释
include ':simpleDemo'
//include ':AeroFFmpegModule'

项目根目录/gradle/wrapper/gradle-wrapper.properties 文件内容

复制代码
#Mon Dec 28 18:07:31 CST 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
#如果打包aar插件(AeroFFmpegModule模块就是一个aar模块),需要将gradle-7.3-bin.zip中的7.3替换进去 7.3
#如果本地离线打包uniapp项目并测试自己制作的aar模块,需要将gradle-8.11.1-bin.zip中的8.11.1替换进去 8.11.1
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.11.1-bin.zip

项目根目录/build.gradle

复制代码
dependencies {
        classpath 'com.android.tools.build:gradle:8.7.3'//8.7.3  7.1.0
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
        classpath 'com.github.kezong:fat-aar:1.3.8'
    }

如果运行AeroFFmpegModule模块

项目根目录的 settings.gradle 文件内容

复制代码
//如果打包aar插件(AeroFFmpegModule模块就是一个aar模块),需要将 //include ':simpleDemo' 这行注释
//如果本地离线打包uniapp项目并测试自己制作的aar模块,需要将 //include ':AeroFFmpegModule' 这行注释
//include ':simpleDemo'
include ':AeroFFmpegModule'

项目根目录/gradle/wrapper/gradle-wrapper.properties 文件内容

复制代码
#Mon Dec 28 18:07:31 CST 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
#如果打包aar插件(AeroFFmpegModule模块就是一个aar模块),需要将gradle-7.3-bin.zip中的7.3替换进去 7.3
#如果本地离线打包uniapp项目并测试自己制作的aar模块,需要将gradle-8.11.1-bin.zip中的8.11.1替换进去 8.11.1
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-7.3-bin.zip

项目根目录/build.gradle

复制代码
dependencies {
        classpath 'com.android.tools.build:gradle:7.1.0'//8.7.3  7.1.0
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
        classpath 'com.github.kezong:fat-aar:1.3.8'
    }

按照上述配置后

编写完成后

在以下位置找到自己制作的uniapp原生插件

8.aar原生插件在本地离线打包中测试功能,为什么不直接用云打包测试呢,因为云打包不好看异常

根据第7条,切换到运行simpleDemo模块需要的gradle版本,

并在新建的uniapp项目中使用已经注册的AeroFFmpegModule模块

将打好的包放进这个位置

其他配置参考 https://nativesupport.dcloud.net.cn/AppDocs/usesdk/android.html

运行simpleDemo模块,观察是否调用到自己的原生插件

9.自己的原生插件集成到uniapp项目中,使用云打包,为什么不用本地离线打包生成最后的apk,因为uniapp很多其他原生插件配置太多,所以走先制作测试好原生插件,在真实项目中直接使用

package.json文件内容

复制代码
{
  "name": "AeroFFmpeg",
  "id": "AeroFFmpeg",
  "version": "1.0.0",
  "description": "AeroFFmpeg 视频处理插件",
  "_dp_type": "nativeplugin",
  "_dp_nativeplugin": {
    "android": {
      "plugins": [
        {
          "type": "module",
          "name": "AeroFFmpegModule",
          "class": "com.mmwz.aeroffmpegmodule.AeroFFmpegModule"
        }
      ],
      "integrateType": "aar",
      "libs": ["AeroFFmpegModule-release.aar"]
    }
  }
}

配置使用这个原生插件

然后打自定义基座

然后运行到真机

在uniapp前端通过使用原生插件

复制代码
// 引入原生插件
	const ffmpegModule = uni.requireNativePlugin('AeroFFmpegModule');

10.我的资源包下载

通过网盘分享的文件:unisdk5.06_制作uniapp原生插件.rar

链接: https://pan.baidu.com/s/1T4lZw23Tf7MTMe4COCEZjQ?pwd=vktd 提取码: vktd

里面有AeroFFmpeg的uniapp原生插件,可以直接使用

使用方式

复制代码
<template>
	<view class="content">
		<image class="logo" src="/static/logo.png"></image>
		<view class="text-area">
			<text class="title">{{title}}</text>
		</view>

		<view class="container">
			<button @click="compressVideo">压缩视频</button>
			<button @click="cancelTask">取消任务</button>
			<view class="status">{{ status }}</view>
		</view>
	</view>
</template>

<script>
	// 引入原生插件
	const ffmpegModule = uni.requireNativePlugin('AeroFFmpegModule');//AeroFFmpegPlugin

	export default {
		data() {
			return {
				title: 'Hello',
				status: '等待操作'
			}
		},
		onLoad() {

		},
		methods: {
			compressVideo() {
				this.status = '处理中...';

				// 在页面 onLoad 或 mounted 中测试
				console.log('插件对象:', ffmpegModule);
				if (!ffmpegModule) {
					uni.showToast({
						title: '插件加载失败,请检查自定义基座',
						icon: 'none'
					});
				} else {
					uni.showToast({
						title: '插件对象已获取',
						icon: 'success'
					});
				}

				// 获取文件路径(示例:应用私有目录)
				const inputPath = plus.io.convertLocalFileSystemURL('_doc/input.mp4');
				const outputPath = plus.io.convertLocalFileSystemURL('_doc/output.mp4');

				// 构造 FFmpeg 命令
				const command = `ffmpeg -i ${inputPath} -c:v copy -c:a copy ${outputPath}`;

				// 调用插件执行
				ffmpegModule.execute(command, (result) => {
					console.log('执行结果:', result);
					if (result.code === 0) {
						this.status = '压缩完成!';
						// 处理输出文件...
					} else {
						this.status = '失败: ' + result.message;
					}
				});
			},

			cancelTask() {
				ffmpegModule.cancelTask((result) => {
					this.status = '任务已取消';
				});
			},

			getProgress() {
				ffmpegModule.getProgressTime((result) => {
					console.log('进度:', result.progressMs + 'ms');
				});
			}
		}
	}
</script>

<style>
	.content {
		display: flex;
		flex-direction: column;
		align-items: center;
		justify-content: center;
	}

	.logo {
		height: 200rpx;
		width: 200rpx;
		margin-top: 200rpx;
		margin-left: auto;
		margin-right: auto;
		margin-bottom: 50rpx;
	}

	.text-area {
		display: flex;
		justify-content: center;
	}

	.title {
		font-size: 36rpx;
		color: #8f8f94;
	}
</style>
相关推荐
Fate_I_C1 天前
uniappx 鸿蒙运行包制作失败
华为·uni-app·uniapp·harmonyos
chQHk57BN1 天前
跨平台前端开发:用Flutter和UniApp一次编写多端运行
flutter·uni-app
自然 醒2 天前
uni-app开发微信小程序,如何使用towxml去渲染md格式和html标签格式的内容?
微信小程序·uni-app·html
CHB2 天前
uni-agent,你的数字员工来了
人工智能·uni-app·vibecoding
h_jQuery2 天前
uniapp使用canvas实现逐字书写任意文字内容,后合成一张图片提交
前端·javascript·uni-app
困困的果果头2 天前
【uniapp】解决H5嵌套在web-view中时打包页面与状态栏重叠
前端·uni-app
前端 贾公子2 天前
Uniapp 使用 UQRCode 创建二维码
uni-app
Rattenking2 天前
uni-app组件开发----自定义数字键盘组件
前端·javascript·uni-app
笨笨狗吞噬者2 天前
代理的妙用:uni-app 小程序是怎样用 `Proxy` 和 `wrapper` 抹平平台差异的
前端·微信小程序·uni-app