JVM использует метод Java_xx вместо JavaCritical_xx - PullRequest
0 голосов
/ 30 января 2020

У меня есть следующий код 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.

Есть похожий вопрос: Как заставить JavaCritical действительно работать на JNI , но я собираю нативную часть и запускаю ее на MacOS.

UPD: я собрал под jvmTarget 1.8, версию kotlin 1.3.61, и работал на jvm 1.8.0_222 и 11.0.2

1 Ответ

0 голосов
/ 31 января 2020

Этот комментарий от @apangin имеет решающее значение:

Только скомпилированные JIT методы вызывают Critical Natives. Хотя метод интерпретируется, он будет вызывать стандартную реализацию.

Я пришел к такому же выводу, прочитав код JVM, но было приятно видеть, что это подтверждено.

I удалось принудительно запустить функцию JavaCritical, передав -Xcomp моему вызову java, что вызывает компиляцию JIT при первом вызове метода. Это смехотворно ужасная идея , поэтому я надеюсь, что ваш общий случай использования включает в себя горячую l oop вокруг вашей функции JavaCritical. Эта проблема GitHub измерила вызовы JavaCritical JNI и обнаружила, что они только незначительно быстрее.

tl; dr: Если это не для исследовательских целей, вам лучше отказаться от поиска JavaCritical и использовать "простой" JNI (который уже должен быть достаточно быстрым).

...