使用JNI而不是JNA调用本机代码?

2024-01-03

与 JNI 相比,JNA 似乎更容易用来调用本机代码。在什么情况下您会使用 JNI 而不是 JNA?


  1. JNA 不支持 C++ 类的映射,因此如果您使用 C++ 库,则需要 jni 包装器
  2. 如果你需要大量的内存复制。例如,您调用一个方法,该方法返回一个大字节缓冲区,您更改其中的某些内容,然后您需要调用另一个使用该字节缓冲区的方法。这需要您将此缓冲区从 c 复制到 java,然后将其从 java 复制回 c。在这种情况下,jni 将在性能上获胜,因为您可以在 c 中保留和修改此缓冲区,而无需复制。

这些是我遇到的问题。也许还有更多。但一般来说,jna 和 jni 的性能差别不大,所以只要能使用 JNA 的地方,就使用它。

EDIT

这个答案似乎很受欢迎。所以这里有一些补充:

  1. If you need to map C++ or COM, there is a library by Oliver Chafic, creator of JNAerator, called BridJ https://github.com/nativelibs4java/BridJ. It is still a young library, but it has many interesting features:
    • 动态 C / C++ / COM 互操作:调用 C++ 方法,创建 C++ 对象(以及来自 Java 的 C++ 类的子类!)
    • 直接的类型映射,很好地使用泛型(包括更好的指针模型)
    • 完整的 JNAerator 支持
    • 适用于 Windows、Linux、MacOS X、Solaris、Android
  2. 至于内存复制,我相信JNA支持直接ByteBuffers,因此可以避免内存复制。

因此,我仍然认为,只要有可能,最好使用 JNA 或 BridJ,如果性能至关重要,则恢复到 jni,因为如果需要频繁调用本机函数,性能损失会很明显。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用JNI而不是JNA调用本机代码? 的相关文章

随机推荐

  • 使用什么 Java 异常类来处理 HTTP 错误?

    我正在使用阿帕奇Http客户端 http hc apache org httpclient 3 x 并且希望通过 Java 异常机制向调用代码传达 HTTP 错误 400 错误请求 404 未找到 500 服务器错误等 Java 标准库或广
  • WebSockets 版本之间的协议差异是什么?

    是否有任何地方的摘要协议差异各种 WebSockets 草案之间的关系 浏览器支持级别仍然遍布各处 因此仅考虑 RFC 是不够的 显然 Sec WebSocket Version 发生了变化 而且我知道早期的格式非常不同 然而 我指的是协议
  • Angular 9 Google 地图 API 地点自动完成

    我有一个 Angular 9 刚刚从 8 迁移 我需要使用 Google Places API 我有一个 API 密钥 进行地址自动完成 我可以使用 angular googlemaps 库显示地图 但我无法制作自动完成工作 我尝试使用ht
  • 使用 libvlc 将相机流式传输到内存并显示帧

    我正在尝试使用 libvlc 将捕获设备 相机 流式传输到内存中 我无法显示内存中存储的数据的图像 内存内容看起来没问题 我使用 Visual Studio 及其内存窗口检查了它 imshow 创建的图片始终是灰色的 如何显示内存中存储的图
  • jquery按钮不响应click方法

    所以我使用append方法用jquery动态渲染一个段落 我想向它添加一个点击事件 但由于某种原因 点击事件不起作用 我知道解决方案可能很简单 但我是jquery的新手 我会很感激任何帮助 我知道函数内部的代码可以工作 因为我用静态按钮测试
  • 什么是数据对齐?在 C 中类型转换指针时,为什么以及何时应该担心? [复制]

    这个问题在这里已经有答案了 我找不到一个像样的文档来解释对齐系统如何工作以及为什么某些类型比其他类型更严格地对齐 我会尝试简短地解释一下 什么是数据对齐 计算机的体系结构由处理器和内存组成 记忆是按细胞组织的 因此 0x00 data 0x
  • StackExchange 站点如何关联用户帐户和 OpenID 登录信息?

    我喜欢 StackExhchange StackOverflow 集成 OpenID 的方法 据我了解 这个过程是这样的 如果用户向 OpenID 提供商 即 Google 注册 StackOverflow 或类似网站 会为该用户创建一个帐
  • Python 类中的线程

    我最近开始使用python的线程模块 经过一番尝试和错误后 我设法使用大多数教程中给出的以下示例代码来使基本线程工作 class SomeThread threading Thread def init self count threadi
  • 2021年8月18日SDK更改后如何从代码中设置azure实验名称?

    2021 年 8 月 18 日 Microsoft 为了我们的方便 对其 Azure ML SDK 进行了以下更改 https learn microsoft com en us azure machine learning azure m
  • JSF 注释不适用于 Spring-boot

    我曾试图使用来自Spring Boot 和 JSF Primefaces Richfaces https stackoverflow com questions 22544214 spring boot and jsf primefaces
  • 如何从 Chrome 扩展程序向本机应用程序发送消息?

    我有一个用 C 编写的本机应用程序 我可以使用以下命令将数据从本机应用程序发送到 chrome 扩展如何从本机应用程序向 Chrome 扩展程序发送消息 https stackoverflow com questions 18134665
  • 连接可选列表

    我有三个Optional gt 必须将它们组合并返回 我尝试使用Optional map and flatmap 但没有成功 public Optional
  • 春季启动日志记录

    我正在使用 Spring boot 构建一个简单的 REST 服务 我想知道处理日志记录的最合适的方法 In my 应用程序属性文件我有以下内容 logging level org springframework web DEBUG 在开发
  • 并行代码可扩展性差

    最近我一直在分析我的并行计算在 16 核处理器上实际上是如何加速的 我得出的一般公式 线程越多 每个核心的速度就越慢 让我很尴尬 以下是我的CPU负载和处理速度的图表 因此 您可以看到处理器负载增加 但速度增加得慢得多 我想知道为什么会发生
  • 如何使用opencv python在对象中找到用于测量目的的参考点? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 输入图像寻找参考点 https i stack imgur com g0Dt1 png 我的问题陈述是我想测量钻头的长度 因此 如果我
  • 如何监视默认导出函数

    sinon spy 有 2 个参数 对象和函数名称 我有一个模块如下所示 module exports function xyz 我如何定义间谍xyz 我没有可以使用的对象名称 想法 如果你使用 ES6 模块导入功能 上面的方法实际上不起作
  • 使用现有的 pptx 创建新的 pptx Python-Pptx

    我正在尝试使用 old pptx 创建 new pptx old pptx 有 4 张幻灯片 我想在 4 张幻灯片中创建内容几乎相同的 new pptx 仅进行少量文本修改 我跳过了下面代码中的修改部分 您可以举个例子 例如将小写字母转换为
  • 导入 shapefile 外部的遮罩区域(底图/matplotlib)

    我正在通过 Matplotlib 在美国和加拿大东海岸的底图上绘制数据 除了基础层 填充的等值线图 之外 我还使用 Matplotlib 的 readshapefile 工具将此焦点区域的 shapefile 覆盖在数据之上 我想知道如何屏
  • 将蛋糕脚本中的警告消息记录在文本文件中

    我正在使用下面的蛋糕脚本来编译我的C 项目 中显示的警告消息很少PowerShell执行脚本时 我喜欢将警告记录在物理位置的文本文件中 例如 D WarningReport txt 下面是我用来编译项目的蛋糕脚本任务 Task Build
  • 使用JNI而不是JNA调用本机代码?

    与 JNI 相比 JNA 似乎更容易用来调用本机代码 在什么情况下您会使用 JNI 而不是 JNA JNA 不支持 C 类的映射 因此如果您使用 C 库 则需要 jni 包装器 如果你需要大量的内存复制 例如 您调用一个方法 该方法返回一个