Kotlin JVM使用Java_xx方法而不是JavaCritical_xx

Kotlin JVM使用Java_xx方法而不是JavaCritical_xx,kotlin,java-native-interface,Kotlin,Java Native Interface,我有以下JNI代码: JNIEXPORT jint JNICALL Java_demo_Test_callCritical (JNIEnv *env, jclass jobj_clazz) { printf("I'm not critical\n"); return 1; } JNIEXPORT jint JNICALL JavaCritical_demo_Test_callCritical () { printf ("I'm critical\n"); return

我有以下JNI代码:

JNIEXPORT jint JNICALL Java_demo_Test_callCritical
    (JNIEnv *env, jclass jobj_clazz)
{
  printf("I'm not critical\n");
  return 1;
}

JNIEXPORT jint JNICALL JavaCritical_demo_Test_callCritical ()
{
  printf ("I'm critical\n");
  return 1;
}
和Kotlin代码:

package demo

class Test {
    companion object {
        @JvmStatic
        external fun callCritical(): Int
    }
}
如果我运行这个程序,它将处理Java方法,而不是JavaCritical。我满足了运行JavaCritical的所有条件

还有一个类似的问题:,但我构建了本机部分并在MacOS上运行它

UPD:我在jvmTarget 1.8(kotlin 1.3.61的版本)下构建,并在jvm 1.8.0_222和11.0.2上运行@apangin是至关重要的:

只有JIT编译的方法才能调用关键本机。在解释方法时,它将调用标准实现

我通过阅读JVM代码得出了大致相同的结论,但很高兴看到这一点得到了证实

我能够通过将
-Xcomp
传递给我的
java
调用来强制启动
JavaCritical
函数,这将在第一次调用方法时强制JIT编译。这是一个很好的例子,所以我希望您的通用用例包括围绕JavaCritical函数的热循环

最后,这一切可能没有多大意义。测量了JavaCritical JNI调用,发现它们只稍微快一点


tl;dr:除非是出于研究目的,否则最好放弃对JavaCritical的搜索,而使用“普通”JNI(应该已经足够快了)。

请编辑您的问题以做出解释。您是如何编译和测试它的?您的Kotlin代码有
testCritical
,而您的JNI代码有
callCritical
,需要一个
demo
包。我们仍然缺少调用
callCritical
的代码。请尽力给我们看一个实际的版本。@Botje抱歉,fixes补充道。但我不明白调用函数需要什么样的示例。main中通常的函数调用,但我认为您不需要添加它。请显示
nm libXXX.dylib | grep callCritical
的输出。在我们深入讨论之前,我想确保符号定义正确。我得到以下信息:
0000000000000F50T\uJavaCritical\uDemo\uTest\uCallCritical 0000000000000F20T\uJava\uDemo\uCallCritical
谢谢。我的函数是在迭代器中调用的,因此这种行为适合我。