是否可以使用 JNI 在 C 或 C++ 中实现 Java 接口?

2024-04-21

假设一个 Java 库包含一个类,我们称它为Foo。该类包含一个构造函数和两个方法:

// constructor
Foo();

// returns a random int
public int bar();

// generates a random int "x" and calls integerGenerated(x)
public void generateInt(IntGeneratorListenerInterface listenerInterface);

这假设有一个 Java 接口IntGeneratorListenerInterface用一种方法:

void integerGenerated(int generatedInt);

我可以打电话bar()来自本机 C 和 C++。这是一个 C++ 示例,假设正确初始化JNIEnv env:

// instantiate Foo
jclass fooClass = env->FindClass("com/my/package/Foo");
jmethodID constructorMethodID = env->GetMethodID(fooClass, "<init>", "()V");
jobject fooInstance = env->NewObject(fooClass, constructorMethodID);

// call bar()
jmethodID barMethodID = env->GetMethodID(fooClass, "bar", "()I");
jint result = env->CallIntMethod(fooInstance, barMethodID);
printf("%d", result);

我想做的是实现接口IntGeneratorInterface从 C/C++ 中这样当我打电话时generateInt()使用类似的 JNI 调用,我可以在 C 中接收回调,例如:

void integerGenerated(int x)
{
    // do something with the int
}

我的问题:有没有办法在 C/C++ 中实现 Java 接口,这样我就可以将有效的东西传递给generateInt(),并且有integerGenerated()用C调用?

我研究过 JNIRegisterNatives(),但我相信这需要 Java 代码声明并调用“本机”方法(如果我错了,请纠正我),而且我没有修改现有 Java 库的奢侈。另请注意,这里仅使用简单的 Java 库来举例说明我的问题。我意识到这样简单的功能可以很容易地在本地编写。


是的。就像您对任何其他本机方法所做的那样:

class NativeRunnable implements Runnable {
    @Override
    public native void run();
}

现在只需使用javah创建头文件并实现函数。

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

是否可以使用 JNI 在 C 或 C++ 中实现 Java 接口? 的相关文章

  • 电话号码的正则表达式,不允许全零

    需要您的正则表达式帮助 我当前的正则表达式是 d 8 最小长度为 8 不允许包含字母 特殊字符和空格 我还想禁止全零 如 00000000 Thanks 该模式应该可以满足您的需求 0 d 8 The 0 部分是负前瞻 将阻止仅输入零 Ex
  • 起订量要求?违背了目的?

    是否需要虚拟化您想要模拟的所有属性访问器就违背了模拟的目的 我的意思是 如果我必须修改我的对象并虚拟化我想要模拟的每个访问器 我难道不能继承我的类并自己模拟它吗 你的问题非常有效 但如果你仔细想想 没有其他方法可以模拟课程 如果你采用一个接
  • 获取 std::variant 当前持有的 typeid(如 boost::variant type())

    我已经从 boost variant 迁移到 std variant 但遇到了障碍 我在 boost type 中使用了一个很好的函数 它可以让你获取当前持有的 typeid 看https www boost org doc libs 1
  • 键盘加速器在 UWP 应用中停止工作

    我正在尝试将键盘加速器添加到 UWP 应用程序中的 CommandBar 菜单项 当应用程序启动时 这工作正常 但在我第一次打开溢出菜单后 加速器停止工作 这似乎不会发生在主要命令 菜单之外 上 只有溢出菜单内的辅助命令才会发生 此外 单击
  • 静态类变量与外部变量相同,只是具有类作用域吗?

    在我看来 静态类变量与外部变量相同 因为你只需要declare它在static int x extern int x语句 并在其他地方实际定义它 通常在 cpp 文件中 静态类变量 h file class Foo static int x
  • 访问“if”语句之外的变量

    我怎样才能使insuranceCost以外可用if陈述 if this comboBox5 Text Third Party Fire and Theft double insuranceCost 1 在 if 语句之外定义它 double
  • Paradox 表 - Oledb 异常:外部表不是预期的格式

    我正在使用 Oledb 从 Paradox 表中读取一些数据 我遇到的问题是 当我将代码复制到控制台应用程序时 代码可以工作 但在 WinForms 中却不行 两者都以 x86 进行调试 我实际上只是复制代码 在 WinForms 应用程序
  • 有没有办法使用 i387 fsqrt 指令获得正确的舍入?

    有没有办法使用 i387 fsqrt 指令获得正确的舍入 除了改变精确模式在 x87 控制字中 我知道这是可能的 但这不是一个合理的解决方案 因为它存在令人讨厌的重入型问题 如果 sqrt 操作中断 精度模式将出错 我正在处理的问题如下 x
  • 方法“xxx”不能是事件的方法,因为该类派生的类已经定义了该方法

    我有一个代码 public class Layout UserControl protected void DisplayX DisplayClicked object sender DisplayEventArgs e CurrentDi
  • 存储过程上的 OdbcCommand - 输出参数上出现“未提供参数”错误

    我正在尝试执行存储过程 通过 ODBC 驱动程序针对 SQL Server 2005 但收到以下错误 过程或函数 GetNodeID 需要参数 ID 但未提供该参数 ID 是我的过程的 OUTPUT 参数 在存储过程中指定了一个输入 mac
  • 序列化和反序列化 Visual Studio 解决方案文件 - 或以编程方式编辑?

    我想以编程方式添加和删除项目 解决方案文件夹和其他项目 例如解决方案的资源文件 但我不确定最好的方法是什么 对于那些不知道的人 高度简化 解决方案文件 sln 通常如下所示 Microsoft Visual Studio Solution
  • 默认值 C# 类 [重复]

    这个问题在这里已经有答案了 我在控制器中有一个函数 并且我收到表单的信息 我有这个代码 public Actionresult functionOne string a string b string c foo 我尝试将其转换为类似的类
  • 格式化货币

    在下面的示例中 逗号是小数点分隔符 我有这个 125456 89 我想要这个 125 456 89 其他示例 23456789 89 gt 23 456 789 89 Thanks 看看这个例子 double value 12345 678
  • 更改 IdentityServer4 实体框架表名称

    我正在尝试更改由 IdentityServer4 的 PersistedGrantDb 和 ConfigurationDb 创建的默认表名称 并让实体框架生成正确的 SQL 例如 而不是使用实体IdentityServer4 EntityF
  • ASP.NET Core Razor Page 多路径路由

    我正在使用 ASP NET Core 2 0 Razor Pages 不是 MVC 构建系统 但在为页面添加多个路由时遇到问题 例如 所有页面都应该能够通过 abc com language 访问segment shop mypage 或
  • 如何将对象转换为传递给函数的类型?

    这不会编译 但我想做的只是将对象转换为传递给函数的 t public void My Func Object input Type t t object ab TypeDescriptor GetConverter t ConvertFro
  • 如何获取 QIcon 的文件/资源​​路径

    假设我做了这样的事情 QIcon myIcon resources icon ico 我稍后如何确定该图标的路径 例如 QString path myIcon getPath 问题是 没有getPath 会员 我找不到类似的东西 但肯定有办
  • c# 模拟 IFormFile CopyToAsync() 方法

    我正在对一个异步函数进行单元测试 该函数将 IFormFile 列表转换为我自己的任意数据库文件类列表 将文件数据转换为字节数组的方法是 internal async Task
  • 无法使 Polly 超时策略覆盖 HttpClient 默认超时

    我正在使用 Polly 重试策略 并且正如预期的那样 在重试过程中HttpClient达到 100 秒超时 我尝试了几种不同的方法来合并 Polly 超时策略 将超时移至每次重试而不是总计 但 100 秒超时仍然会触发 我读过大约 5 个
  • 新的 .NET 6 控制台模板中的 C# 函数重载不起作用

    我在尝试重载该函数时遇到错误Print object in the 新的 NET 6 C 控制台应用程序模板 https learn microsoft com en us dotnet core tutorials top level t

随机推荐

  • Pyramid.security:使用 unauthenticated_userid(request) 从数据库获取用户信息真的安全吗?

    我正在尝试使用 Pyramid 文档创建可访问的用户数据缓存 使 用户对象 可用作请求属性 http docs pylonsproject org projects pyramid cookbook en latest auth user
  • Spring 表达语言的映射

    我想使用 SpEL 来评估一些谓词 由于值 属性是动态的 因此我没有特定的 bean 类 因此 我们有一个 hashmap 其中 根据应用程序状态 键映射到不同的 POJO bean 例如 Person person new Person
  • Git 推送失败,“非快进更新被拒绝”

    我已经通过 Git Online 编辑了我的 GIT 存储库 当我尝试推送本地代码更改后 出现错误 Git push failed To prevent from losing history non fast forward update
  • Oracle中如何检查所有字段是否唯一?

    Oracle中如何检查所有字段是否唯一 SELECT myColumn COUNT FROM myTable GROUP BY myColumn HAVING COUNT gt 1 如果出现次数大于 1 即它们不是唯一的 这将返回所有 my
  • Java 中的数据验证和扫描器

    我有一个关于数据验证和扫描仪的问题 下面的代码检查用户输入 除了整数之外的任何内容都是不允许的 并且要求用户重新输入一个值 我的问题是 只有当扫描仪打开时 代码才有效在 while 循环内声明 如果在外部声明扫描仪 则程序将无限执行 这是为
  • 如何在.net core项目中使用SignalR Core监听postgresql数据库?

    我正在开发 net core Web 应用程序 我想监听我的 PostgreSQL 数据库 如果桌面上有任何变化 我必须得到它 所以根据我的研究 我必须使用SignalR Core 我用 SignalR 做了一些示例应用程序 例如聊天应用程
  • pod init 获得未初始化的常量 ActiveSupport::XmlMini::IsolatedExecutionState (NameError)

    mac os 成功安装cocoapods 1 11 2 红宝石 v ruby 3 1 1p18 2022 02 18 修订版 53f5fc4236 x86 64 darwin21 宝石 v 3 3 8 但 exec pod init 收到错
  • django 管理中的多态行为

    问题 假设我有三个类A B和C 其中B是A的子类 C是B的子类 A lt B lt C 当我打开管理并列出所有 A 时 我看到所有 A B 和 C 但是 当我点击其中一个链接查看详细信息并编辑该特定 B 时 我只会看到 B 的字段 即使该实
  • 突出显示用户选择的文本片段

    我有一个 div with some text div 我需要突出显示用户选择的文本片段 我已经部分实现了这个 这是我的代码 http jsfiddle net Greatshock fy09jo8w 8 thisRespondHightl
  • 能否在上传 Azure CloudBlockBlob 的同时在其上设置元数据?

    我目前使用以下方式上传 CloudBlockBlob CloudBlockBlob UploadFromStreamAsync 然后我立即在上面设置了一堆用户元数据 问题是 我有一个事件网格事件 该事件在上传 blob 时触发 但事件处理程
  • 如何在多个 HTML 页面上播放背景音频?

    是否有解决方案可以让背景音频 音乐在网站上的多个页面上播放 而无需在每个页面加载时重新启动 该网站当前使用框架集 但我正在寻找替代方案 如果不让整个网站都 AJAX 我认为框架是唯一的方法 如果您需要的话 这里有一个关于制作 ajax 站点
  • JavaScript 多行字符串[重复]

    这个问题在这里已经有答案了 问题是 像在 PHP 中一样将多行字符串存储到变量中的 JavaScript 方法是什么 如果 多行字符串 是指包含换行符的字符串 则可以通过使用转义它们来编写这些字符串 n 对于换行符 var multilin
  • 如何从命令行将 Svelte 文件编译为 JavaScript?

    我是新来的Svelte https svelte dev 快速提问 Svelte 编译器有 CLI 吗 如何访问它 我知道 Svelte 有一个使用 rollup 的预配置设置 但不使用什么 用于构建应用程序 一切都很好 但我只需要 CLI
  • Sublime Text 2 在 Java 开发方面是否胜过 Eclipse [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 是时候使用 Django 1.5 了吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • a += b 与 a = a + b 不同[重复]

    这个问题在这里已经有答案了 可能的重复 为什么 在列表上表现异常 https stackoverflow com questions 2347265 why does behave unexpectedly on lists 今天我发现了P
  • C++ 编译器会优化重复的函数调用吗?

    编译器 通常或特别 是否优化重复的函数调用 例如 考虑这种情况 struct foo member type m return type f const returns by value 函数定义在一个翻译单元中 return type f
  • 使用样式化组件设置滑块拇指样式

    我正在尝试使用 React 的样式组件来设置滑块的样式 但我不知道如何设置拇指的样式 我有一个看起来像这样的CSS faderInput webkit slider thumb webkit appearance none width 15
  • Javascript C++ 绑定?

    我有一些 C 代码想要公开给 Web 应用程序的客户端 理想情况下 我想为我的 C 类编写 Javascript 包装对象 以便我可以在客户端使用它们 这以前做过吗 有谁有链接来展示如何实现这一目标 有一个库可以将 C 代码转换为 java
  • 是否可以使用 JNI 在 C 或 C++ 中实现 Java 接口?

    假设一个 Java 库包含一个类 我们称它为Foo 该类包含一个构造函数和两个方法 constructor Foo returns a random int public int bar generates a random int x a