如何从Kotlin调用静态JNI函数?

时间:2019-07-19 17:31:12

标签: kotlin java-native-interface

在Java中这不是问题,但是在Kotlin中,我们没有静态的。我们有用于相同目的的伴随对象,但是,作为额外的对象,它们在JNI调用中得到了错误的名称(Java_package_Type00024Companion_function),这与JNI的期望不符。显然,从主类调用它会在GetStaticMethodID中导致JNI错误。

3 个答案:

答案 0 :(得分:4)

可以将@JvmStatic annotation添加到在伴侣对象to cause the generation of a static method上定义的函数中,您可以在jni调用中引用该函数。

从链接的Kotlin文档中:

class C {
  companion object {
    @JvmStatic fun callStatic() {}
    fun callNonStatic() {}
  }
}
     
// java
C.callStatic(); // works fine
C.callNonStatic(); // error: not a static method

答案 1 :(得分:0)

一种解决方法是在Java中创建包装器,然后从Kotlin使用包装器。

答案 2 :(得分:0)

在Kotlin中使用外部关键字。

external fun nativeKey1() : String?

keys.c类:

Java_com_mobile_application_MyApplication_00024Companion_nativeKey1(
    JNIEnv *env, jobject thiz) {
static const char randomStr[] = "89!Q4q+x#f6~iOL9@&c>2JY!s!x@2Ai-SbHYA@EenokBTE#NoTiE6jl4-5zovso@2Ai-SbHYAEenokBNoTiE6jl4SbHYA@EenokBTE";
char key[17] = {0};

// Start garbage code
int i = 0;
float j = 0;
int loop_count = 0;

for (i=0; i < loop_count; i++) {
    int n = (i / 2) + 29 + i + 17;
    key[0] = randomStr[n];

}