Android JNI RegisterNatives: вызывать один раз со всеми или один раз для каждой функции - PullRequest
1 голос
/ 21 октября 2019

Идиоматическим примером использования функции JNI RegisterNatives() в среде Android является определение массива со всеми вашими функциями C ++ и один раз вызов RegisterNatives(). Однако что если я вызову RegisterNatives() один раз для каждой функции, каждый раз с размером массива одного метода? Примеры для контраста (не компилировали их, на самом деле я просто быстро набрал их, поэтому, пожалуйста, прости за любые ошибки):

Один вызов, много функций (идиоматический вариант использования):

// Assume static functions `add` and `sub` have been defined
jclass clazz = env->FindClass("com/company/MyJavaClass");

std::vector<JNINativeMethod> methods {
  {"add", "(II)I", (void*)&add },
  {"sub", "(II)I", (void*)&sub },
};

env->RegisterNatives(clazz, methods.data(), methods.size());

Множество вызовов, одна функция на вызов:

// Assume static functions `add` and `sub` have been defined
jclass clazz = env->FindClass("com/company/MyJavaClass");

std::vector<JNINativeMethod> methods1 {
  {"add", "(II)I", (void*)&add },
};

env->RegisterNatives(clazz, methods1.data(), methods1.size());

std::vector<JNINativeMethod> methods2 {
  {"sub", "(II)I", (void*)&sub },
};

env->RegisterNatives(clazz, methods2.data(), methods2.size());

Есть ли различия между ними, кроме синтаксиса? Я не уверен, есть ли проблемы с производительностью с этим, или если это даже разрешено. Я не видел ничего в документации JNI, явно запрещающей это.

Для контекста, я хочу сделать это таким образом, потому что я пишу некоторые вспомогательные оболочки для отображения методов C ++ в Java nativeметодов, и это гораздо проще сделать, если я сразу зарегистрирую каждый отдельный метод вместо создания контейнера и регистрации этого контейнера на более позднем этапе.

1 Ответ

0 голосов
/ 22 октября 2019

Нет проблем с повторным вызовом RegisterNatives.

...