我正在尝试使用带有libsecret的K/N。它包含以下结构:
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中使用它的示例
发布于 2020-10-20 17:33:12
似乎默认情况下没有办法,我最终这样做了:
/**
* 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相同的指针位置计算
发布于 2020-10-20 15:21:49
据我所知,这里最直接的选择是使用[]操作符,并将分配的SecretSchemaAttribute分配给这些地址。要了解有关指针类型交互的更多信息,请查看此documentation page。它可能有点过时,但可以在这里或在kotlinlang Slack上提出更多问题。
https://stackoverflow.com/questions/64413030
复制相似问题