Kotlin / Native:如何修改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方法,因为CArrayPointerCPointer)没有公开修改方法

我还注意到了一些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分配给这些地址。要了解有关指针类型交互的更多信息,请选中此documentation page。可能有些过时了,但您可以在此处或在kotlinlang Slack处提出进一步的问题。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...