如何通过JNI实现Kotlin属性?

3
在 Kotlin 中,我可以使用 external 关键字将函数的实现委托给本地代码。鉴于 Kotlin 属性只是一对 getter 和 setter 函数的语法糖,我认为也应该有可能使用本地代码来实现属性。然而,我似乎无法弄清楚如何做到这一点。
如果我在 getset 关键字前面添加 external,Kotlin 告诉我它正在期望一个函数体:
[图片来源](https://istack.dev59.com/dhOFA.webp)
当然,整个重点不在于在 Kotlin 中拥有一个函数体。但是,如果我仍然添加了一个函数体,Kotlin(相当预期地)告诉我外部声明不能有函数体:
[图片来源](https://istack.dev59.com/hCOPQ.webp)
我的语法是错误的吗?还是说根本没有办法使用 JNI 实现 Kotlin 属性?
2个回答

3

我找到解决方案了!通过JNI实现属性是可以的,我只是使用了错误的语法!正确的语法是:

class Test {
    var value: Int
        external get // No parentheses or parameter list!
        external set
}

这个语法似乎还没有文档记录。
编辑:我为Kotlin文档创建了一个PR,已经合并。所以现在这个功能被官方记录在 Kotlin与JNI使用

2

仅仅是猜测,我没有尝试过。文档中没有提到属性的external,所以你可能需要像这样传递。

class Foo {
    var bar: Int
        get() = getBarNative()
        set(value) = setBarNative(value)
    private external fun getBarNative(): Int
    private external fun setBarNative(value: Int)
}

这是一种解决方法,以防直接通过JNI实现属性不可能。我仍然希望有可能实现。 - Daniel Wolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接