Java native 方法。公共(public)与私有(private)

标签 java java-native-interface

假设我们需要在 native 代码中实现一些 java 方法并将其公开给用户。我们知道所有的工作都是由 native 端完成的,即 java 代码的唯一职责是将用户提供的参数传递给 native 代码并返回结果。据此,java层可能有两种实现方式:

  • 通过使用直接向用户公开的 native 方法:

    public native Object doSmth(Object arg0, Object arg1);
    
  • 通过使用围绕私有(private)本地方法的瘦公共(public)包装器:

    public Object doSmth(Object arg0, Object arg1) {
        return nativeDoSmth(arg0, arg1);
    }
    
    private native Object nativeDoSmth(Object arg0, Object arg1);
    

我在实际项目中看到过这两种方法,甚至在同一个项目中同时看到了前者和后者。

所以,我的问题是:是否有任何提到的替代方案具有一些技术或性能或可维护性优势,应该鼓励只使用一种变体。或者,也许这只是一个品味问题?

最佳答案

So, my question is: does any of mentioned alternatives have some technical or performance or maintainability advantages, that should encourage to use only one variant.

可维护性优势是这里的关键。如评论中所述,该对象公开了其行为。它如何实现不是用户的事。这为您提供了更大的灵 active 。

假设将来(请参阅:可维护性)您发现您想要/需要调整该方法,使其在 native 调用之前和/或之后执行某些操作。在第一种方法中,您需要弃用该方法并创建一个新方法。在第二种方法中,您只需在方法中添加您需要的任何内容,用户并不关心。

至于性能,理论上,第一种方法更快,因为它少了一次调用。实际上,它完全可以忽略不计。

关于Java native 方法。公共(public)与私有(private),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41474772/

相关文章:

java - 常量 MissingServletRequestParameterException

java - 格式化文本字段和 JComboBox 在一起

java - 如何使用 Eclipse TPTP 分析 JNI 应用程序?

java - 共享库中本地方法调用的 Jython UnsatisfiedLinkError

android - 编译项目时出现 undefined reference 错误(ANDROID NDK)

java - JNI 将 Java double 转换为 jdouble 时遇到问题

java - 如何使用 JTabbedPane 引用特定选项卡?

java - 加载所有组件后执行代码块

java - 用于调用 Web 服务的 beanshell 脚本

java - 在 Java 中使用 SWIG 处理返回指向结构数组的指针的 C 函数