首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin/本地:如何修改CArrayPointer?

Kotlin/本地:如何修改CArrayPointer?
EN

Stack Overflow用户
提问于 2020-10-18 19:58:38
回答 2查看 95关注 0票数 0

我正在尝试使用带有libsecret的K/N。它包含以下结构:

代码语言:javascript
复制
typedef struct {
    const gchar *name;
    SecretSchemaFlags flags;
    SecretSchemaAttribute attributes[32];
} SecretSchema;

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

cinterop生成了以下类:

代码语言:javascript
复制
@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 */
}

我试着这样定义它:

代码语言:javascript
复制
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中使用它的示例

EN

回答 2

Stack Overflow用户

发布于 2020-10-20 17:33:12

似乎默认情况下没有办法,我最终这样做了:

代码语言:javascript
复制
/**
 * 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>())
}

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

票数 1
EN

Stack Overflow用户

发布于 2020-10-20 15:21:49

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64413030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档