簡體   English   中英

如何為 kotlin 本機創建 void* 指針

[英]How to create void* pointer for kotlin native

我正在嘗試使用本機庫將現有的 c 代碼轉換為 kotlin。 到目前為止,我成功地開始了,但被用於訪問結構或對象的指針所困擾。 在 c 中像這樣:

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

但是如何將這些指針保存在 kotlin 中? 像這樣的嘗試:

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

結果是

Native interop types constructors must not be called directly

我讀到: kotlin inerop

任何提示表示贊賞。

我找到了一個可行的解決方案。 我犯了一個錯誤,認為我的指針分配錯誤,所以我復制了 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 中創建了一個工作示例。 我將代碼部分地從 c 移動到 kotlin 本機。 所以kotlin版本經歷了幾個階段,以:

/* Kotlin with native interop */
memScoped {
    var avar: COpaquePointerVar = alloc()
    var ret = gattlib_adapter_open(null, avar.ptr)
    print("Adapter opened\n")
    if (ret > 0) {
        print( "ERROR: Failed to open adapter.\n");
        return
    }

    print("start scan\n")
    gattlib_adapter_scan_enable(avar.value, staticCFunction { a, b, c, d ->
        kotlin.native.initRuntimeIfNeeded()
        print("found dev\n")
    }, 5, NULL /* user_data */);

    gattlib_adapter_scan_disable(avar.value)

    print("Scan completed\n");
}

我是學生,所以這可能不是最佳實踐,請隨時糾正我。 我希望這個片段可以幫助任何剛開始使用 kotlin native 的人。

@巴蘇爾。 不能直接實例化指針類型,嘗試在堆上或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)

暫無
暫無

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

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