[英]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.