Android JNI RegisterNatives:对所有内容调用一次,或者每个函数调用一次

Android JNI RegisterNatives: Call once with everything, or once per function

本文关键字:一次 或者 函数调用 调用 RegisterNatives JNI Android      更新时间:2023-10-16

在Android 环境中使用 JNI 的RegisterNatives()函数的惯用示例是定义一个包含所有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++方法映射到 Javanative方法,如果我立即注册每个单独的方法而不是构建容器并在以后注册该容器,则这样做要容易得多。

一次又一次地调用 RegisterNatives 没有问题。

相关文章: