You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin Native中如何初始化Array<T>并从C代码中传参调用

问题解答

可行性说明

该操作完全可以实现,你遇到的段错误是由于对Kotlin/Native的C互操作规范使用错误导致。

错误原因

Kotlin的Array属于Kotlin/Native运行时托管的对象类型,不能直接将C侧原生数组强转赋值给libnative_kref_kotlin_Array的pinned字段,必须通过Kotlin/Native导出的专用API创建托管数组实例后再传入调用。

正确实现方案

步骤1:补充Kotlin侧导出方法(可选,简化C侧调用)

你可以选择在Kotlin侧主动暴露数组创建辅助方法,降低C侧调用泛型数组API的复杂度:

// 新增Kotlin代码,导出给C侧调用
fun createPersonArray(size: Int): Array<Person?> = arrayOfNulls(size)

如果不想新增Kotlin代码,也可以直接在Kotlin/Native生成的libnative.h头文件中查找对应泛型数组的原生创建API直接调用。

步骤2:修正C侧调用代码

你需要先创建托管数组、逐个赋值元素,再传入目标函数,同时注意内存回收逻辑:

libnative_ExportedSymbols* lib = libnative_symbols();
// 初始化Person实例
libnative_kref_test_Person person = lib->kotlin.root.test.Person.Person(20);
// 创建长度为1的Person托管数组
libnative_kref_kotlin_Array peopleArray = lib->kotlin.root.test.createPersonArray(1);
// 给数组第0位赋值,数组赋值API为Kotlin/Native自动导出
lib->kotlin.root.kotlin.Array.set(peopleArray, 0, person);
// 调用目标方法
libnative_KInt sum = lib->kotlin.root.test.sumAges(peopleArray);

// 内存回收:先释放数组引用,再释放单个Person实例引用
lib->DisposeStablePointer(peopleArray.pinned);
lib->DisposeStablePointer(person.pinned);

printf("Sum is %d\n", sum);

注意事项

所有从C侧获取的Kotlin对象引用(包括数组实例、自定义类实例等)都需要手动调用DisposeStablePointer释放,否则会造成内存泄漏。


内容的提问来源于stack exchange,提问作者Mihovil Ilakovac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 02:27:03