Kotlin/Native转C动态库:如何访问方法返回实例的类成员?
Kotlin/Native C互操作:访问导出类的实例成员
你看到的pinned是Kotlin/Native用来管理对象内存固定的内部字段,C端不能直接操作。Kotlin的类不会直接转成C结构体暴露成员,必须通过生成的访问器函数来获取,具体操作如下:
核心逻辑
Kotlin/Native导出C库时,会为每个Kotlin类生成不透明指针(比如typedef struct Persons Persons;),同时自动生成对应成员的访问函数,命名规则为类名_成员名,还会生成创建、销毁对象的配套函数。
具体操作步骤
结合你的代码和头文件内容,按以下流程访问成员:
获取Persons实例
调用生成的函数创建API实例并获取Persons对象:RandomUserApiJS* api = RandomUserApiJS_create(); Persons* persons = RandomUserApiJS_getPersonsDirect(api);访问Persons的成员
头文件里会自动生成对应results和info的访问函数:- 获取results数组:
ResultArray* Persons_results(Persons* this_); - 获取info对象:
Info* Persons_info(Persons* this_);
- 获取results数组:
处理数组类型(results)
对于Kotlin的Array<Result>,导出后会生成ResultArray的操作函数,用于遍历和访问元素:ResultArray* results = Persons_results(persons); int resultCount = ResultArray_size(results); // 获取数组长度 for (int i = 0; i < resultCount; i++) { Result* result = ResultArray_get(results, i); // 获取单个元素 // 访问Result的子成员,比如name字段 Name* name = Result_name(result); char* firstName = Name_first(name); printf("用户名:%s\n", firstName); // 用完及时释放子对象 Name_destroy(name); Result_destroy(result); }内存释放
所有导出的Kotlin对象都要调用对应的_destroy函数释放,避免内存泄漏:ResultArray_destroy(results); Persons_destroy(persons); RandomUserApiJS_destroy(api);
注意事项
- Kotlin的
String在C端以char*形式暴露,若头文件中有字符串释放函数(比如KotlinString_destroy),使用后需调用释放。 - 确保导出Kotlin代码时,所有需要访问的类(
Persons、Result、Info等)都被包含在导出配置中,否则不会生成对应的访问函数。
内容的提问来源于stack exchange,提问作者RagAnt
相关产品推荐
相关产品推荐

