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

Kotlin/Native转C动态库:如何访问方法返回实例的类成员?

Kotlin/Native C互操作:访问导出类的实例成员

你看到的pinned是Kotlin/Native用来管理对象内存固定的内部字段,C端不能直接操作。Kotlin的类不会直接转成C结构体暴露成员,必须通过生成的访问器函数来获取,具体操作如下:

核心逻辑

Kotlin/Native导出C库时,会为每个Kotlin类生成不透明指针(比如typedef struct Persons Persons;),同时自动生成对应成员的访问函数,命名规则为类名_成员名,还会生成创建、销毁对象的配套函数。

具体操作步骤

结合你的代码和头文件内容,按以下流程访问成员:

  1. 获取Persons实例
    调用生成的函数创建API实例并获取Persons对象:

    RandomUserApiJS* api = RandomUserApiJS_create();
    Persons* persons = RandomUserApiJS_getPersonsDirect(api);
    
  2. 访问Persons的成员
    头文件里会自动生成对应results和info的访问函数:

    • 获取results数组:ResultArray* Persons_results(Persons* this_);
    • 获取info对象:Info* Persons_info(Persons* this_);
  3. 处理数组类型(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);
    }
    
  4. 内存释放
    所有导出的Kotlin对象都要调用对应的_destroy函数释放,避免内存泄漏:

    ResultArray_destroy(results);
    Persons_destroy(persons);
    RandomUserApiJS_destroy(api);
    

注意事项

  • Kotlin的String在C端以char*形式暴露,若头文件中有字符串释放函数(比如KotlinString_destroy),使用后需调用释放。
  • 确保导出Kotlin代码时,所有需要访问的类(Persons、Result、Info等)都被包含在导出配置中,否则不会生成对应的访问函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:01:04