提交 00ac9803 编写于 作者: 杜庆泉's avatar 杜庆泉

完善混编文档

上级 79900e40
...@@ -15,25 +15,28 @@ ...@@ -15,25 +15,28 @@
3 如果存在`UTS`不支持的语法,还需要把原生代码封装成 `aar`/`framework` 等原生库形式,再供`UTS`代码调用 3 如果存在`UTS`不支持的语法,还需要把原生代码封装成 `aar`/`framework` 等原生库形式,再供`UTS`代码调用
**这是一件很繁琐的事情,`UTS原生混编`的出现彻底解决了这个问题:** **这是一件很繁琐的事情,`原生混编`的出现彻底解决了这个问题:**
开发者只需要把正确的 `Kotlin`/`swift`/`java` 原生代码按照约定放在`UTS插件`目录中,就可以通过 `uts`无缝使用这些代码。
`UTS插件`的编译流程中,`UTS`源码是 `Kotlin`/`swift` 源码的上游环节,也就是说 `UTS`本身就会被编译为`Kotlin`/`swift` 源码,所以 `UTS` 与原生语言之间的相互调用,本质是**同一语言内部,不同函数/对象之间的相互调用,不会有任何调用成本和性能损耗** 开发者只需要把正确的 `Kotlin`/`swift`/`java` 原生代码放在`UTS插件`目录中,就可以通过 `uts`无缝使用这些代码。
和uts插件代码一样,混编的原生代码可以直接真机运行,省去了手动集成`AAR`三方库需要打包自定义基座的环节,大大提升了开发效率。 [UTS插件](https://doc.dcloud.net.cn/uni-app-x/plugin/uts-plugin.html)的编译流程中,`UTS`代码是原生代码的上游环节,也就是说 `UTS`本身就会被编译为`Kotlin`/`swift` 源码。所以 `UTS` 调用原生代码的过程,**本质是同一语言内部,不同函数/对象之间的调用过程,不会有任何额外的调用成本和性能损耗**
--- ---
`uts代码`一样,混编的原生代码可以直接真机运行,省去了手动集成`AAR`三方库后打包自定义基座的环节,大大提升了开发效率。
使用`UTS原生混编`之后,开发者想要实现原生功能,仅需要: 使用`UTS原生混编`之后,开发者想要实现原生功能,仅需要:
+ 1 通过`搜索引擎`/`AIGC`/`原生API文档` 得到原生代码片段 1 通过`搜索引擎`/`AIGC`/`原生API文档` 得到原生代码片段
+ 2 放入UTS插件中,真机运行
2 放入UTS插件中,真机运行。就可以看到效果。
即可以看到执行结果。
---
下面我们以`内存监控`功能为例,分别拆解 `UTS原生混编`技术在`Android``ios`平台上的使用步骤 下面我们以`内存监控`功能为例,分别拆解 `UTS原生混编`技术在`Android``ios`平台上的使用步骤
...@@ -113,26 +116,24 @@ import io.dcloud.uts.console ...@@ -113,26 +116,24 @@ import io.dcloud.uts.console
object NativeCode { object NativeCode {
fun getMemInfo():Array<Number>{
fun memMonitor(){
val activityManager = UTSAndroid.getUniActivity()?.getSystemService(ACTIVITY_SERVICE) as ActivityManager
val activityManager = UTSAndroid.getUniActivity()?.getSystemService(ACTIVITY_SERVICE) as ActivityManager val memoryInfo = ActivityManager.MemoryInfo()
val memoryInfo = ActivityManager.MemoryInfo() activityManager.getMemoryInfo(memoryInfo)
activityManager.getMemoryInfo(memoryInfo) val availMem = memoryInfo.availMem / 1024 / 1024
val availMem = memoryInfo.availMem / 1024 / 1024 val totalMem = memoryInfo.totalMem / 1024 / 1024
val totalMem = memoryInfo.totalMem / 1024 / 1024
// availMem 可用内存,单位MB
// availMem 可用内存,单位MB // totalMem 设备内存,单位MB
// totalMem 设备内存,单位MB console.log(availMem,totalMem)
console.log(availMem,totalMem) return arrayOf(availMem,totalMem)
} }
} }
``` ```
上面的代码中,我们将获取内存的信息的功能以`Kotlin`静态方法`NativeCode.memMonitor()` 的形式对外暴露 上面的代码中,我们将获取内存的信息的功能以`Kotlin`静态方法`NativeCode.getMemInfo()` 的形式对外暴露
接下来,我们将整理好的原生代码添加到 在`app-android` 目录 接下来,我们将整理好的原生代码添加到 在`app-android` 目录
...@@ -174,11 +175,27 @@ import android.content.Context.ACTIVITY_SERVICE ...@@ -174,11 +175,27 @@ import android.content.Context.ACTIVITY_SERVICE
import io.dcloud.uts.UTSAndroid import io.dcloud.uts.UTSAndroid
import io.dcloud.uts.setInterval import io.dcloud.uts.setInterval
import io.dcloud.uts.clearInterval import io.dcloud.uts.clearInterval
import io.dcloud.uts.UTSArray
import io.dcloud.uts.console import io.dcloud.uts.console
object NativeCode { object NativeCode {
/**
* 同步获取内存信息
*/
fun getMemInfo():Array<Number>{
val activityManager = UTSAndroid.getUniActivity()?.getSystemService(ACTIVITY_SERVICE) as ActivityManager
val memoryInfo = ActivityManager.MemoryInfo()
activityManager.getMemoryInfo(memoryInfo)
val availMem = memoryInfo.availMem / 1024 / 1024
val totalMem = memoryInfo.totalMem / 1024 / 1024
// availMem 可用内存,单位MB
// totalMem 设备内存,单位MB
console.log(availMem,totalMem)
return arrayOf(availMem,totalMem)
}
/** /**
* 记录上一次的任务id * 记录上一次的任务id
*/ */
...@@ -187,7 +204,7 @@ object NativeCode { ...@@ -187,7 +204,7 @@ object NativeCode {
/** /**
* 开启内存监控 * 开启内存监控
*/ */
fun startMemMonitor(callback: (UTSArray<Number>) -> Unit){ fun startMemMonitor(callback: (Array<Number>) -> Unit){
if(lastTaskId != -1){ if(lastTaskId != -1){
// 避免重复开启 // 避免重复开启
...@@ -204,11 +221,8 @@ object NativeCode { ...@@ -204,11 +221,8 @@ object NativeCode {
val totalMem = memoryInfo.totalMem / 1024 / 1024 val totalMem = memoryInfo.totalMem / 1024 / 1024
console.log(availMem,totalMem) console.log(availMem,totalMem)
// 将得到的内存信息,封装为UTSArray(即UTS环境中的Array对象) // 将得到的内存信息,封装为kotlin.Array 单位是MB
val retArray = UTSArray<Number>() callback(arrayOf(availMem,totalMem))
retArray.add(availMem)
retArray.add(totalMem)
callback(retArray)
},1000,2000) },1000,2000)
...@@ -249,18 +263,22 @@ object NativeCode { ...@@ -249,18 +263,22 @@ object NativeCode {
在我们的示例中,UTS中的调用的代码是这样的: 在我们的示例中,UTS中的调用的代码是这样的:
```ts ```ts
// 开启内存监控 // 开启内存监听
export function callKotlinCallbackUTS(callback: (res: string) => void) { export function callKotlinCallbackUTS(callback: (res: Array<number>) => void) {
NativeCode.startMemMonitor(function(res:Array<number>){ NativeCode.startMemMonitor(function(res:kotlin.Array<number>){
console.log(res) callback(Array.fromNative(res))
callback("设备内存:" + res[0] + ",可用内存:" + res[1]) })
})
} }
// 停止内存监控任务 // 结束内存监听
export function callKotlinStopCallbackUTS() { export function callKotlinStopCallbackUTS() {
NativeCode.stopMemMonitor() NativeCode.stopMemMonitor()
} }
// 同步获取内存信息
export function callKotlinMemGet():Array<number> {
let kotlinArray = NativeCode.getMemInfo()
return UTSArray.fromNative(kotlinArray)
}
``` ```
上面的代码,我们在UTS中使用一个 入参为`Array<number>`类型的`function`对象就完成了对`kotlin`原生代码的调用。 上面的代码,我们在UTS中使用一个 入参为`Array<number>`类型的`function`对象就完成了对`kotlin`原生代码的调用。
...@@ -275,6 +293,7 @@ uts文件与uvue 之间的相互调用,属于[UTS插件开发](https://doc.dcl ...@@ -275,6 +293,7 @@ uts文件与uvue 之间的相互调用,属于[UTS插件开发](https://doc.dcl
```vue ```vue
<template> <template>
<view> <view>
<button @tap="kotlinMemGetTest">通过kotlin获取内存(同步)</button>
<button @tap="kotlinMemListenTest">kotlin监听内存并持续回调UTS</button> <button @tap="kotlinMemListenTest">kotlin监听内存并持续回调UTS</button>
<button @tap="kotlinStopMemListenTest">停止监听</button> <button @tap="kotlinStopMemListenTest">停止监听</button>
<text>{{memInfo}}</text> <text>{{memInfo}}</text>
...@@ -283,26 +302,32 @@ uts文件与uvue 之间的相互调用,属于[UTS插件开发](https://doc.dcl ...@@ -283,26 +302,32 @@ uts文件与uvue 之间的相互调用,属于[UTS插件开发](https://doc.dcl
<script> <script>
import { callKotlinCallbackUTS,callKotlinStopCallbackUTS} from "../../uni_modules/demo-mem"; import { callKotlinCallbackUTS,callKotlinStopCallbackUTS,callKotlinMemGet} from "../../uni_modules/demo-mem";
export default { export default {
data() { data() {
return { return {
memInfo: 'Hello' memInfo: '-'
} }
}, },
onLoad() { onLoad() {
}, },
methods: { methods: {
kotlinMemGetTest:function () {
let array = callKotlinMemGet()
this.memInfo = "可用内存:" + array[0] + "MB--整体内存:" + array[1] + "MB"
},
kotlinMemListenTest: function () { kotlinMemListenTest: function () {
callKotlinCallbackUTS(function(ret:string){ callKotlinCallbackUTS(function(ret:Array<number>){
this.memInfo = ret this.memInfo = "可用内存:" + ret[0] + "MB--整体内存:" + ret[1] + "MB"
}) })
}, },
kotlinStopMemListenTest:function () { kotlinStopMemListenTest:function () {
callKotlinStopCallbackUTS() callKotlinStopCallbackUTS()
this.memInfo = "已暂停"
}, },
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册