c-如何为kotlin native创建void*指针



我正在尝试使用本地库将现有的c代码转换为kotlin。到目前为止,我成功地开始了,但被用来访问结构或对象的指针所困扰。像c:中的这样

void *ptr;
foo(&ptr); //init is done inside
bar(&ptr); //ptr is reused

但是如何在科特林保持这些指针呢?这样的尝试:

var avar = CPointerVarOf<COpaquePointer>(NativePtr.NULL)
var bvar: CPointerVarOf<CPointer<*>> = null

中的结果

Native interop types constructors must not be called directly

我读到:kotlin惰性

任何提示都将不胜感激。

我找到了一个可行的解决方案。我犯了一个错误,认为我的指针分配是错误的,所以我复制了ide认为正确的内容。这导致了这样的分配:

var avar:COpaquePointerVar = alloc()

现在Kotlin本地分配都正确。但是纯分配很少能解决问题,所以这里有代码:

/* C Code */
void* adapter;
int ret;
ret = gattlib_adapter_open(NULL, &adapter);
if (ret) {
fprintf(stderr, "ERROR: Failed to open adapter.n");
return 1;
}
ret = gattlib_adapter_scan_enable(adapter, ble_discovered_device, 5, NULL /* user_data */);
if (ret) {
fprintf(stderr, "ERROR: Failed to scan.n");
}
gattlib_adapter_scan_disable(adapter);
puts("Scan completed");

在我注意到我的错误后,我重新阅读了我所有的代码,并在c中创建了一个工作示例。因此kotlin版本经历了几个阶段,最终以结束

/* Kotlin with native interop */
memScoped {
var avar: COpaquePointerVar = alloc()
var ret = gattlib_adapter_open(null, avar.ptr)
print("Adapter openedn")
if (ret > 0) {
print( "ERROR: Failed to open adapter.n");
return
}
print("start scann")
gattlib_adapter_scan_enable(avar.value, staticCFunction { a, b, c, d ->
kotlin.native.initRuntimeIfNeeded()
print("found devn")
}, 5, NULL /* user_data */);
gattlib_adapter_scan_disable(avar.value)
print("Scan completedn");
}

I、 我是个学生,所以这可能不是最好的做法,请随时纠正我。我希望这个片段能帮助任何刚开始使用kotlin母语的人。

@Basur!不能直接实例化指针类型。尝试在堆上或memScoped {...}块内部分配它们,如下所示:

val voidy:COpaquePointerVar = nativeHeap.alloc()
fun a(ptr:CPointer<COpaquePointerVar>){
println(ptr.pointed.value)
ptr.pointed.value = NULL
}
fun b(ptr:CPointer<COpaquePointerVar>){
println(ptr.pointed.value)
}
a(voidy.ptr)
b(voidy.ptr)
...
nativeHeap.free(voidy)

相关内容

  • 没有找到相关文章

最新更新