在 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++ 方法映射到 Java native
方法编写一些方便的包装器,如果我立即执行此操作会容易得多注册每个单独的方法,而不是构建容器并在稍后注册该容器。
最佳答案
一次又一次调用 RegisterNatives 没有问题。
关于java - Android JNI RegisterNatives : Call once with everything, 或每个函数一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58493082/