簡體   English   中英

Kotlin/Native:如何修改 CArrayPointer?

[英]Kotlin/Native: how to modify CArrayPointer?

我正在嘗試將 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

默認情況下似乎沒有辦法,我最終這樣做了:

/**
 * 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>())
}

它對我有用,並使用與訪問相同的指針位置計算

據我所知,這里最直接的選擇是使用[]運算符並將分配的SecretSchemaAttribute分配給這些地址。 要了解有關指針類型交互的更多信息,請查看此文檔頁面 它可能有點過時,但可以在此處或在 kotlinlang Slack 上提出更多問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM