Java Native Access 不支持 C++,对吗?

2023-12-21

我在网上找到了许多关于用于 C++ 库的 JNA 的参考(包括 stackoverflow 上的一些),但我在 JNA 文档中找不到任何内容表明这是可能的。特别是,似乎没有任何方法可以包装 C++ 类。

我需要本机访问才能使用 RTAudio,但 RTAudio 的所有函数都是 RTAudio 类的成员函数。所以只是想确认一下,JNA 不是正确的选择吗?


这个问题的意思是问如何使用 JNA 调用 C++ 实例方法 https://stackoverflow.com/questions/1873194/jna-calling-methods-upon-c-instance-passed-back-from-dll,这是可能的,但你必须做一些工作。特别是,您需要编写一个包装器extern "C"s 您实​​际需要调用的任何函数。

对于任意任意type* function()定义,您可以使用 JNA 映射该方法作为返回com.sun.jna.Pointer,但您将无法从 JNA 调用 C++ 对象上的方法。

一个简单的解决方法是编写一个 C 接口库,它只需为您调用对象上的方法...所以如果您有一些成员函数foo()您可以从 C++ 代码中导出 C 方法:

extern "C" void bar(type* var){
   var->foo();
}

显然这会给你增加一些工作......但我怀疑切换到的开销JNI http://en.wikipedia.org/wiki/Java_Native_Interface大概是一样的。

JNA 只关心方法在 DLL 中导出的方式——而且必须是withoutC++ 装饰(因此extern "C"),因此您可以在任何此类方法中执行您需要的任何操作,而无需公开您调用的方法。

在我上面设计的例子中,这意味着foo(),只要它是在 DLL 中定义的,实际上甚至不必公开。由于它是一个 C++ 函数,JNA 无法直接调用它,但可以从 JNA 可以调用的函数内调用它,这就是我提出的解决方案有效的原因。

所以,是的,您可以将对所有成员函数(创建、操作、销毁)的调用完全封装在单个函数中,而 JNA 不会关心。

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

Java Native Access 不支持 C++,对吗? 的相关文章

随机推荐

  • Autofac PropertiesAutowired - 是否可以忽略一个或多个属性?

    尽管建议通过构造函数传递依赖项 但我发现使用无参数构造函数然后自动装配所有属性的开发成本显着减少 并使应用程序更易于开发和维护 然而有时 例如在视图模型上 我有一个在容器中注册的属性 但我不想在构造时填充该属性 例如绑定到容器的所选项目 有
  • 谷歌移动视觉库无法下载

    我正在尝试将 Google Mobile Vision TextRecogniser API 实现到我的应用程序中 以读取给定图像中的文本 当我尝试使用该功能时 出现以下错误 W DynamiteModule Local module de
  • 为什么 Julia 不鼓励对 UTF8 字符串建立索引?

    Julia 的入门指南 在 Y 分钟内学习 Julia https learnxinyminutes com docs julia 阻止用户索引 UTF8 字符串 Some strings can be indexed like an ar
  • 如何调整表单大小以自动适应其内容?

    我正在尝试实现以下行为 表单上有一个选项卡控件 在该选项卡控件上有一个树视图 为了防止出现滚动条 我希望表单在第一次显示时根据树视图的内容更改其大小 如果树视图有太多节点无法在窗体的默认大小上显示 则窗体应更改其大小 以便树视图上没有垂直滚
  • 无法在列表框中绑定命令

    我的 WPF 使用 MVVM 方法 我正在尝试在列表控件中绑定 2 个控件
  • 我自己的 R 中的 K 均值算法

    我是 R 编程的初学者 我正在 R 中进行此练习作为编程入门 我已经在 R 中实现了自己的 K 均值实现 但在某一点上卡住了一段时间 我需要达成共识 算法迭代直到找到每个簇的最佳中心 这是没有迭代的原始算法 它只是从整个数据中随机选取一个数
  • 在ColdFusion中,有没有办法确定代码在哪个服务器上运行?

    ColdFusion 代码中是否有任何方法可以确定代码在哪个服务器上执行 我有一些负载平衡的 ColdFusion 服务器 当我捕获异常时 我希望能够知道代码正在哪个服务器上运行 因此我可以将该信息包含在日志记录 报告代码中 服务器是 Wi
  • 当您无法提供色彩美感时手动创建图例

    在试图回答时这个问题 https stackoverflow com questions 34066131 can data points be labeled in stripcharts 34068263 创建所需绘图的一种方法是使用g
  • 为什么在JPA Hibernate中更新查询;所有属性都在 SQL 中更新

    我将 JPA 与 Hibernate 一起使用 当我修改对象的一个 属性并更新它时 生成的 SQL 显示所有列都已更新 为什么它不只更新修改的列 有没有办法实现这一点 因为我觉得这样会更加优化 默认情况下 hibernate 包含更新查询中
  • 在 NetBeans 中找不到主类

    我一直在为我的编程课做作业 我正在使用 NetBeans 我完成了我的项目并且运行良好 当我尝试运行它时 收到一条消息 未找到主类 这是主要的一些代码 package luisrp3 import java io FileNotFoundE
  • 如何使用 Seaborn 在 hexbins 上绘制回归线?

    我终于成功地将我的 hexbin 分布图整理成几乎漂亮的东西 import seaborn as sns x req apply clicks y req reqs wordcount sns jointplot x y kind hex
  • 将 PySpark DenseVector 转换为数组

    我正在尝试将 DenseVector 的 pyspark 数据帧列转换为数组 但总是出现错误 data Vectors dense 8 0 1 0 3 0 2 0 5 0 Vectors dense 2 0 0 0 3 0 4 0 5 0
  • 通过计算雅可比行列式,有效地使用 PyTorch 的 autograd 和张量

    在我之前的question https stackoverflow com questions 67320792 how to use pytorchs autograd efficiently with tensors 67334809
  • jQuery 输入掩码

    嘿 我是 jQuery 新手 我想检查输入框上的 onblur 这种格式 cda 123 表示前 3 个字符空间和 3 个整数 通常我看到代码是写在输入 ID 上的 但如果我想写在类上 那么我该怎么做 例如我有 class InputMas
  • Python - 从多个 Zip 文件中提取 CSV 文件并合并数据

    我有一个 Python 脚本和 pandas 来组合多个 ZIP 文件 我在这里使用 GitHub 存储库中托管的数据 https github com statistikat coronaDAT https github com stat
  • 如何打包 C# 9 源生成器并将其上传到 Nuget?

    我做了一个C 9源代码生成器 你可以找到它here https github com HamedFathi MockableStaticGenerator 当我在另一个解决方案中使用整个项目并将其作为项目引用时 它可以工作 但是当我将其与当
  • 如何在 Amazon EC2 上部署 Eclipse Java Web 动态项目?

    我正在尝试创建一个能够与 Amazon RDS 通信的 Web 项目 我知道如何使用 JDBC 将 localhost 项目连接到 RDS 然而 问题是我从未尝试部署我的项目 这样 例如有人可以输入somePage com 然后转到我的网页
  • 使Python json编码器支持Python的新数据类

    从Python 3 7开始 有一个叫做数据类的东西 from dataclasses import dataclass dataclass class Foo x str 但是 以下情况会失败 gt gt gt import json gt
  • 如何在mui主题中插入字体

    在index css 文件中我有一个字体 我想完全避免这个文件 并将这个配置放在作为 MUI 库实现的一部分创建的 theme js 文件中 怎么做 索引 css font face font family ATTAleckSans W L
  • Java Native Access 不支持 C++,对吗?

    我在网上找到了许多关于用于 C 库的 JNA 的参考 包括 stackoverflow 上的一些 但我在 JNA 文档中找不到任何内容表明这是可能的 特别是 似乎没有任何方法可以包装 C 类 我需要本机访问才能使用 RTAudio 但 RT