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
相关产品推荐
相关产品推荐

