【问题标题】:Kotlin/Native: how to modify CArrayPointer?Kotlin/Native:如何修改 CArrayPointer?
【发布时间】:2020-10-18 11:58:38
【问题描述】:

我正在尝试将 K/N 与 libsecret 一起使用。 它包括以下结构:

typedef struct {
    const gchar *name;
    SecretSchemaFlags flags;
    SecretSchemaAttribute attributes[32];
} SecretSchema;

(来自这里:https://developer.gnome.org/libsecret/0.18/libsecret-SecretSchema.html#SecretSchema

cinterop 生成以下类:

@kotlinx.cinterop.internal.CStruct public final class SecretSchema public constructor(rawPtr: kotlinx.cinterop.NativePtr /* = kotlin.native.internal.NativePtr */) : kotlinx.cinterop.CStructVar {
   @kotlinx.cinterop.internal.CStruct.VarType public companion object : kotlinx.cinterop.CStructVar.Type {
   }

   public final val attributes: kotlinx.cinterop.CArrayPointer<org.libsecret.SecretSchemaAttribute> /* = kotlinx.cinterop.CPointer<org.libsecret.SecretSchemaAttribute> */ /* compiled code */

   public final var flags: org.libsecret.SecretSchemaFlags /* = kotlin.UInt */ /* compiled code */

   public final var name: kotlinx.cinterop.CPointer<org.libsecret.gcharVar /* = kotlinx.cinterop.ByteVarOf<kotlin.Byte> */>? /* compiled code */

   public final var reserved: org.libsecret.gint /* = kotlin.Int */ /* compiled code */

   public final var reserved1: org.libsecret.gpointer? /* = kotlinx.cinterop.CPointer<out kotlinx.cinterop.CPointed>? */ /* compiled code */

   public final var reserved2: org.libsecret.gpointer? /* = kotlinx.cinterop.CPointer<out kotlinx.cinterop.CPointed>? */ /* compiled code */

   public final var reserved3: org.libsecret.gpointer? /* = kotlinx.cinterop.CPointer<out kotlinx.cinterop.CPointed>? */ /* compiled code */

   public final var reserved4: org.libsecret.gpointer? /* = kotlinx.cinterop.CPointer<out kotlinx.cinterop.CPointed>? */ /* compiled code */

   public final var reserved5: org.libsecret.gpointer? /* = kotlinx.cinterop.CPointer<out kotlinx.cinterop.CPointed>? */ /* compiled code */

   public final var reserved6: org.libsecret.gpointer? /* = kotlinx.cinterop.CPointer<out kotlinx.cinterop.CPointed>? */ /* compiled code */

   public final var reserved7: org.libsecret.gpointer? /* = kotlinx.cinterop.CPointer<out kotlinx.cinterop.CPointed>? */ /* compiled code */
}

我试图将其定义为:

alloc<SecretSchema> {
   name = "com.charlag.tuta-bridge".cstr.ptr
   flags = SECRET_SCHEMA_NONE
}

但是,我看不到修改 attributes 的方法,因为 CArrayPointer (CPointer) 没有公开修改方法。

我还注意到了一些 reserved 字段。我应该改用它们吗?

这是它在 C 中如何使用的示例: https://developer.gnome.org/libsecret/0.18/c-examples.html#c-schema-example

【问题讨论】:

    标签: kotlin kotlin-multiplatform kotlin-native


    【解决方案1】:

    好像默认没有办法,我最终这样做了:

    /**
     * This is a version of the function which is missing in standard library. It initializes members
     * of the array.
     * If possible, allocate array of correct elements instead. It might not be possible with C
     * structures.
     */
    inline fun <reified T : CVariable> CArrayPointer<T>.setAt(index: Int, value: CValue<T>) {
        value.write(this.rawValue + index * sizeOf<T>())
    }
    
    

    它适用于我并使用与访问相同的指针位置计算

    【讨论】:

      【解决方案2】:

      据我所知,这里最直接的选择是使用[] 运算符并将分配的SecretSchemaAttribute 分配给这些地址。要了解有关指针类型交互的更多信息,请查看此documentation page。它可能有点过时了,但可以在此处或在 kotlinlang Slack 提出更多问题。

      【讨论】:

      • 这不起作用,因为对于任意类型没有set 重载,仅适用于原语。
      猜你喜欢
      • 1970-01-01
      • 2020-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-10
      • 2020-10-14
      • 1970-01-01
      相关资源
      最近更新 更多