如何在 kotlin native 中实现 native-lib 回调以不出现段错误或因运行时断言而失败

问题描述

我是 Koltin 本机的新手(但之前在 JVM 上使用过它)并且很难弄清楚如何通过转换 this example 来正确实现来自 jackaudio 的回调。

这是我尝试过的:

private lateinit var client: CPointer<jack_client_t>
private lateinit var inputPort: CPointer<jack_port_t>
private var position = nativeHeap.alloc<jack_position_t>()
private var event = nativeHeap.alloc<jack_midi_event_t>()

fun main() {
    println(
        """
                       Print JACK MIDI
        This program creates a JACK MIDI port and will
          print in the console all input it recieves

                     Press Enter to abort
        """
    )

    try {
        startJackMidiCallback()
        val readLine = readLine()
    }
    catch(e: Exception) {
        println(e.message)
    }
    finally {
        nativeHeap.free(position.rawPtr)
        nativeHeap.free(event.rawPtr)
    }
}


fun startJackMidiCallback() {
    client = requireNotNull(jack_client_open("cykuit-pro",JackNullOption,null)) { "Jack server not running?" }
    inputPort = requireNotNull(jack_port_register(client,"midi_in",JACK_DEFAULT_MIDI_TYPE,JackPortIsInput.toULong(),0))

    val callback = staticCFunction(
        fun(nframes: jack_nframes_t,_: copaquePointer?): Int {
            return process(nframes)
        }
    )
    jack_set_process_callback(client,callback,null)

    if (jack_activate(client) != 0) {
        throw IllegalStateException("Cannot activate client")
    }
}

fun process(nframes: jack_nframes_t): Int {

    val portBuf = jack_port_get_buffer(inputPort,nframes)
    val transport = jack_transport_query(client,position.ptr)

    for (i in 0 until jack_midi_get_event_count(portBuf).toInt()) {
        jack_midi_event_get(event.ptr,portBuf,i.toUInt())
        val frame = position.frame
        val subFrame = event.time
        val size = event.size
        val data0 = event.buffer?.get(0) ?: 0
        val data1 = event.buffer?.get(1) ?: 0
        val data2 = event.buffer?.get(2) ?: 0
        println("Event: $i")
        println(
            "Frame $frame SubFrame#: $subFrame \tMessage ($size):\t" +
                "${data0}\t${data1}\t${data2}"
        )
    }

    return 0
}

一旦我尝试打印一些接收到的数据,就会出现段错误

/mnt/agent/work/f01984a9f5203417/runtime/src/main/cpp/Memory.cpp:1581: runtime assert: add ref for reclaimed object

我无法确定我在什么情况下会得到什么。我试图在这里和那里猛击 .freeze() 无济于事。我首先尝试在 process() 函数中使用 memScoped,但即使在调用 jack_transport_query 时也会立即出现段错误

所以我一定是做错了什么,但我很难找到有关此类问题的信息......

提前感谢您的指点!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...