Идиоматическим примером использования функции 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
методов, и это гораздо проще сделать, если я сразу зарегистрирую каждый отдельный метод вместо создания контейнера и регистрации этого контейнера на более позднем этапе.