如何通过 JNI 实现一个 Kotlin 属性?
How to implement a Kotlin property through JNI?
在 Kotlin 中,我可以使用 external
关键字将函数的实现委托给本地代码。鉴于 Kotlin 属性只是一对 getter 和 setter 函数的语法糖,我假设也应该可以使用本机代码实现 属性。但是,我似乎无法弄清楚该怎么做。
如果我在 get
和 set
关键字前加上 external
,Kotlin 告诉我它需要一个函数体:
当然,重点是 而不是 在 Kotlin 中有一个函数体。但是如果我无论如何添加一个,Kotlin(相当预期)告诉我外部声明不能有主体:
我的语法有误吗?或者根本没有办法使用 JNI 实现 Kotlin 属性?
只是猜测。我没试过。该文档没有提到 external
属性,因此您可能必须像这样通过。
class Foo {
var bar: Int
get() = getBarNative()
set(value) = setBarNative(value)
private external fun getBarNative(): Int
private external fun setBarNative(value: Int)
}
我找到了解决办法! 可以通过 JNI 实现属性,我只是使用了错误的语法!正确的语法是:
class Test {
var value: Int
external get // No parentheses or parameter list!
external set
}
此语法似乎尚未记录。
编辑: 我为已合并的 Kotlin 文档创建了一个 PR。所以现在 this feature is officially documented.
在 Kotlin 中,我可以使用 external
关键字将函数的实现委托给本地代码。鉴于 Kotlin 属性只是一对 getter 和 setter 函数的语法糖,我假设也应该可以使用本机代码实现 属性。但是,我似乎无法弄清楚该怎么做。
如果我在 get
和 set
关键字前加上 external
,Kotlin 告诉我它需要一个函数体:
当然,重点是 而不是 在 Kotlin 中有一个函数体。但是如果我无论如何添加一个,Kotlin(相当预期)告诉我外部声明不能有主体:
我的语法有误吗?或者根本没有办法使用 JNI 实现 Kotlin 属性?
只是猜测。我没试过。该文档没有提到 external
属性,因此您可能必须像这样通过。
class Foo {
var bar: Int
get() = getBarNative()
set(value) = setBarNative(value)
private external fun getBarNative(): Int
private external fun setBarNative(value: Int)
}
我找到了解决办法! 可以通过 JNI 实现属性,我只是使用了错误的语法!正确的语法是:
class Test {
var value: Int
external get // No parentheses or parameter list!
external set
}
此语法似乎尚未记录。
编辑: 我为已合并的 Kotlin 文档创建了一个 PR。所以现在 this feature is officially documented.