java - Android JNI RegisterNatives : Call once with everything, 或每个函数一次

标签 java android c++ java-native-interface

在 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/

相关文章:

java - 如何使用 twitter4j 将好友 ID 转换为 Twitter 中相应的名称?

android - 如何初始化谷歌地图,以便放置的标记在 android 中可见

java - 中间件 API 的最佳实践是什么?

c++ - 使用 std::vector 作为 header 中的输入参数定义函数的原型(prototype)

c++ - 使用结果启动异步操作

java - 从 REST Web 服务向客户端发送 .apk 文件?

Java 远程调试 - 如何保持调试器监听?

android挂起的 Intent 通知问题

java - Android OneSignal通知无法打开 "Closed"应用程序

java - Websphere 商业类型属性(property)