Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
DCloud
unidocs-uni-app-x-zh
提交
21edcfc2
U
unidocs-uni-app-x-zh
项目概览
DCloud
/
unidocs-uni-app-x-zh
通知
156
Star
2
Fork
37
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
13
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
unidocs-uni-app-x-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
13
合并请求
13
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
21edcfc2
编写于
8月 02, 2024
作者:
杜庆泉
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
更新 uts混编文档
上级
c1b0bf36
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
78 addition
and
57 deletion
+78
-57
docs/plugin/uts-plugin-hybrid.md
docs/plugin/uts-plugin-hybrid.md
+78
-57
未找到文件。
docs/plugin/uts-plugin-hybrid.md
浏览文件 @
21edcfc2
...
@@ -6,7 +6,7 @@
...
@@ -6,7 +6,7 @@
## 原生混编的优势和适用场景
## 原生混编的优势和适用场景
`原生混编`
出现之前,开发者只能使用
[
UTS语言
](
https://doc.dcloud.net.cn/uni-app-x/uts/
)
来开发
[
UTS插件
](
https://doc.dcloud.net.cn/uni-app-x/plugin/uts-plugin.html
)
。
`原生混编`
出现之前,开发者只能使用
[
UTS语言
](
https://doc.dcloud.net.cn/uni-app-x/uts/
)
来开发
[
UTS插件
](
https://doc.dcloud.net.cn/uni-app-x/plugin/uts-plugin.html
)
对于不熟悉原生的开发者来说,要实现原生功能的开发,往往要经过下面的步骤:
对于不熟悉原生的开发者来说,要实现原生功能的开发,往往要经过下面的步骤:
...
@@ -97,14 +97,15 @@ import KotlinObject from 'xxx.xxx.KotlinObject';
...
@@ -97,14 +97,15 @@ import KotlinObject from 'xxx.xxx.KotlinObject';
```
```
整理完的
`Kotlin`
代码是这样的:
回到我们的示例,现在
整理完的
`Kotlin`
代码是这样的:
```
kotlin
```
kotlin
package
uts.sdk.modules.uts
Syntaxcase
package
uts.sdk.modules.uts
DemoMem
// 这里是原生的包名引用
// 这里是原生的包名引用
import
android.app.ActivityManager
import
android.app.ActivityManager
import
android.content.Context.ACTIVITY_SERVICE
import
android.content.Context.ACTIVITY_SERVICE
// UTS内置对象的包名引用
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
...
@@ -132,7 +133,7 @@ object NativeCode {
...
@@ -132,7 +133,7 @@ object NativeCode {
}
}
```
```
上面的代码
,我们将获取内存的信息的功能以kotlin静态方法的形式对外uts进行暴露。
上面的代码
中,我们将获取内存的信息的功能以kotlin静态方法
`NativeCode.memMonitor()`
的形式对外暴露
接下来,我们将整理好的原生代码添加到 在
`app-android`
目录
接下来,我们将整理好的原生代码添加到 在
`app-android`
目录
...
@@ -140,28 +141,28 @@ object NativeCode {
...
@@ -140,28 +141,28 @@ object NativeCode {
> 注意:java代码需要云打包自定义基座后生效,kotlin代码不需要打包,标准基座即可生效
> 注意:java代码需要云打包自定义基座后生效,kotlin代码不需要打包,标准基座即可生效
是的,就是这样简单。如图所示,我们已经完成了原生代码的集成。
是的,就是这样简单。如图所示,我们已经完成了
对
原生代码的集成。
#### 第三步 在原生代码中调用UTS内置对象
#### 第三步 在原生代码中调用UTS内置对象
在上面的示例中,我们已经实现
获取当前设备内存信息的功能,但是可能
我们还想更进一步:持续监控内存,并且回调信息到uvue页面
在上面的示例中,我们已经实现
了获取当前设备内存信息的功能,但是
我们还想更进一步:持续监控内存,并且回调信息到uvue页面
实现持续调用的方法有很多。这里我们为了演示在
原生kotlin代码中调用UTS内置对象,选择采用
[
setInterval
](
https://doc.dcloud.net.cn/uni-app-x/uts/buildin-object-api/timers.html#setinterval-handler-timeout-arguments
)
函数,实现这个功能:
实现持续调用的方法有很多。这里我们为了演示在
`Kotlin`
代码中调用UTS内置对象,选择采用
[
setInterval
](
https://doc.dcloud.net.cn/uni-app-x/uts/buildin-object-api/timers.html#setinterval-handler-timeout-arguments
)
内置对象来实现这个功能:
使用 UTS内置对象 需要注意两点:
使用 UTS内置对象 需要注意两点:
1 正确引入类名:
1 正确引入类名:
UTS内置对象在具体的平台会有一个对应的类名,举例:
Array ->
io.dcloud.uts.UTSArray
UTS内置对象在具体的平台会有一个对应的类名,举例:
UTS内置的Array -> kotlin中的
io.dcloud.uts.UTSArray
2 正确的处理
原生对象和内置对象直接的转换
2 正确的处理原生对象和内置对象直接的转换
当前示例中不涉及,但如果开发者
遇到 kotlin.Array 转换
当前示例中不涉及,但如果开发者
可能遇到类似 kotlin.Array 转换 UTS内置Array的情况,这种情况可以通过查阅内置对象文档来解决。
完整内置对象和原生对象转换代码示例,大家都可以在具体的内置对象文档上找到。
> 完整的内置对象实现清单和与原生对象转换代码示例,大家都可以在内置对象文档的具体章节找到
原生
`kotlin`
代码的最终形态:
原生
`kotlin`
代码的最终形态:
...
@@ -175,6 +176,7 @@ import io.dcloud.uts.UTSAndroid
...
@@ -175,6 +176,7 @@ 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.UTSArray
import
io.dcloud.uts.console
object
NativeCode
{
object
NativeCode
{
...
@@ -186,7 +188,7 @@ object NativeCode {
...
@@ -186,7 +188,7 @@ object NativeCode {
/**
/**
* 开启内存监控
* 开启内存监控
*/
*/
fun
m
emMonitor
(
callback
:
(
UTSArray
<
Number
>)
->
Unit
){
fun
startM
emMonitor
(
callback
:
(
UTSArray
<
Number
>)
->
Unit
){
if
(
lastTaskId
!=
-
1
){
if
(
lastTaskId
!=
-
1
){
// 避免重复开启
// 避免重复开启
...
@@ -202,6 +204,7 @@ object NativeCode {
...
@@ -202,6 +204,7 @@ object NativeCode {
val
availMem
=
memoryInfo
.
availMem
/
1024
/
1024
val
availMem
=
memoryInfo
.
availMem
/
1024
/
1024
val
totalMem
=
memoryInfo
.
totalMem
/
1024
/
1024
val
totalMem
=
memoryInfo
.
totalMem
/
1024
/
1024
console
.
log
(
availMem
,
totalMem
)
// 将得到的内存信息,封装为UTSArray(即UTS环境中的Array对象)
// 将得到的内存信息,封装为UTSArray(即UTS环境中的Array对象)
val
retArray
=
UTSArray
<
Number
>()
val
retArray
=
UTSArray
<
Number
>()
retArray
.
add
(
availMem
)
retArray
.
add
(
availMem
)
...
@@ -226,71 +229,89 @@ object NativeCode {
...
@@ -226,71 +229,89 @@ object NativeCode {
}
}
```
```
上面的代码中,我们将获取内存的信息的功能以
`Kotlin`
静态方法
`NativeCode.startMemMonitor(callback)`
的形式对外暴露。
这里的
`callback`
参数是一个 参数为
`UTSArray`
类型的
`Kotlin`
函数,对应
`UTS`
中一个参数为
`Array`
的
`function`
对象
至此,内存监控功能的原生代码部分已经完全开发完毕。接下来,我们编写UTS代码来使用它。
至此,内存监控功能的原生代码部分已经完全开发完毕。接下来,我们编写UTS代码来使用它。
#### 第三步 编写uts调用代码
#### 第四步 编写`UTS`调用代码
如我们在前文所讲,
`UTS`
是
`Kotlin`
语言的上游语言。所有
`Kotlin`
代码中的:
`类`
、
`对象`
、
`函数`
、
`变量`
,均可以在uts中直接使用。
如我们在前文所讲,UTS是kotlin语言的上游语言。所有kotlin 代码中的:类、对象、函数、变量,均可以在uts中直接使用。
**但是反之,则不行**
。
因为
`UTS`
的编译器兼容了
`Kotlin`
的语法规则,所以
`UTS`
中调用
`Kotlin`
代码可以被很好的支持,即使升级HBuilderX版本也不会有什么问题。
调用的代码是这样的:
但
`UTS`
从未保证过编译对应的
`Kotlin`
的具体规则。所以虽然开发者可以通过一些取巧的方式实现:kotlin中调用UTS代码,但这是不被支持的,遇到类似HBuilderX版本升级之类的情况,类似代码可能会失效或者异常。
在我们的示例中,UTS中的调用的代码是这样的:
```
ts
```
ts
// 开启内存监控
export
function
callKotlinCallbackUTS
(
callback
:
(
res
:
string
)
=>
void
)
{
export
function
callKotlinCallbackUTS
(
callback
:
(
res
:
string
)
=>
void
)
{
NativeCode
.
kotlinCallbackUTS
(
function
(
res
:
Array
<
number
>
){
NativeCode
.
startMemMonitor
(
function
(
res
:
Array
<
number
>
){
console
.
log
(
res
)
console
.
log
(
res
)
callback
(
"
设备内存:
"
+
res
[
0
]
+
"
,可用内存:
"
+
res
[
1
])
callback
(
"
设备内存:
"
+
res
[
0
]
+
"
,可用内存:
"
+
res
[
1
])
})
})
}
}
// 停止内存监控任务
export
function
callKotlinStopCallbackUTS
()
{
NativeCode
.
stopMemMonitor
()
}
```
```
上面的代码,我们在UTS中使用一个 入参为
`Array<number>`
类型的
`function`
对象就完成了对
`kotlin`
原生代码的调用。
#### 第五步 回调参数到uvue页面
#### 注意事项
uts文件与uvue 之间的相互调用,属于
[
UTS插件开发
](
https://doc.dcloud.net.cn/uni-app-x/plugin/uts-plugin.html
)
的相关内容,这里不展开叙述。开发者可以查阅相关文档掌握这部分知识。
##### 原生代码使用UTS内置对象
下面仅列出了uvue示例代码。用于完整展示内存监控示例:
UTS的
[
内置对象
](
../uts/buildin-object-api/number.md
)
和
[
平台专用对象
](
../uts/utsandroid.md
)
均可以在原生环境使用,下面以kotlin中打印日志到HBuilder X 控制台为例说明:
```
vue
<
template
>
<view>
<button
@
tap=
"kotlinMemListenTest"
>
kotlin监听内存并持续回调UTS
</button>
<button
@
tap=
"kotlinStopMemListenTest"
>
停止监听
</button>
<text>
{{
memInfo
}}
</text>
</view>
</
template
>
<
script
>
第一步:手动导入对应的包名,包名规则为:
`io.dcloud.uts.xxx`
。这里的 xxx 是具体的对象的类名 :
import
{
callKotlinCallbackUTS
,
callKotlinStopCallbackUTS
}
from
"
../../uni_modules/demo-mem
"
;
```
kotlin
export
default
{
import
io.dcloud.uts.console
// kt或java代码
data
()
{
```
return
{
memInfo
:
'
Hello
'
}
},
onLoad
()
{
},
methods
:
{
kotlinMemListenTest
:
function
()
{
callKotlinCallbackUTS
(
function
(
ret
:
string
){
this
.
memInfo
=
ret
})
},
第二步: 导入包名后,以原生方式使用内置对象
kotlinStopMemListenTest
:
function
()
{
callKotlinStopCallbackUTS
()
},
}
}
</
script
>
```
kotlin
console
.
log
(
"Hello World"
)
// kt或java代码
```
```
这样就实现了在kt或java代码中打印日志到HBuilderX的控制台。
不过这个导入和使用过程将没有代码提示,输出的变量信息也不会包含变量所在的文件和代码行号等信息。
##### UTS内置对象与原生类型的对应关系
下面列出内置对象对应的类名,如果需要在原生环境和UTS环境/uvue环境中互传数据,建议转换为标准内置对象实现后再进行传递。
|uts 内置对象 |编译成的原生类名
|:---- |:---
|Array |io.dcloud.uts.UTSArray
|Number |io.dcloud.uts.UTSNumber
|String |kotlin.String
|Set |io.dcloud.uts.Set
|Map |io.dcloud.uts.Map
|UTSJSONObject|io.dcloud.uts.UTSJSONObject
|JSON |io.dcloud.uts.JSON
|Date |io.dcloud.uts.Date
|Math |io.dcloud.uts.Math
|Promise |io.dcloud.uts.UTSPromise
|RegExp |io.dcloud.uts.UTSRegExp
|Error |io.dcloud.uts.UTSError
|console |io.dcloud.uts.console
## iOS平台
## iOS平台
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录