JNI - 如何使用具有不同字段的多个 Jni 包装器实例?

2023-12-07

背景

我有一个 android 项目,它使用 JNI(使用 NDK)以 Java 和 C/C++ 进行编码。

我在java端创建了一个Jni java包装器,它将自己完成所有Jni操作,而除了这个包装器之外,没有其他java类可以直接访问jni操作。

问题

问题是,我希望创建此包装器的多个实例,而 Jni 部分应该为每个 Jni 包装器有一个实例。

这是一个问题,因为 Jni 部分为所有实例保留相同的字段。

问题

我该如何解决这个问题,以便对于 jni 包装器的每个 java 实例,jni 部分都会有一个实例?

我在想,也许我可以将所有字段放入一个 C++ 类中,并有一个 init() 函数,该函数将为 JniWrapper 的 CTOR 返回一个新实例,从那时起,对于每个需要字段的 JNI 函数,它将获取这个类作为参数。也许它可能是一个指针,如图所示这个链接.

可悲的是,我不知道该怎么做。

有人可以帮忙吗?

sample

这是一个示例代码,我希望它能让那些不理解问题的人更清楚:

java部分:

public class JniWrapper
  {
  static
    {
    System.loadLibrary("JniTest");
    }

  private native void foo(Bitmap bitmap);
  }

jni部分:

...
// sadly, all of those fields are actually a global fields
int _intField;
float _floatField;    
//those are just sample fields. i would also like to store pointers and objects...

JNIEXPORT void JNICALL ...foo(JNIEnv * env, jobject obj, jobject bitmap)
  {
  // do something with the fields, as if they all belong to the JniWrapper, 
  // and no other instances of JniWrapper are allowed to change them
  }

您需要在 JNI 端拥有 C++ 类,并且需要将 C++ 类的实例与 JNI 包装器类的每个实例相关联。您需要将本机方法添加到new and deleteC++ 类实例,并且您将需要一种防弹方法来确保delete每次释放 JNI 包装类的实例时都会调用调用方法,例如通过一个close()方法,finally{}块,甚至是一个finalize()方法:这是其使用合法的一种情况。您需要在每个 Java 实例中存储一个指向 C++ 实例的指针,例如作为一个Javalong,并且您需要在 C++ 端获取它并将其转换为 C++ 类实例以获取每个实例的数据。

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

JNI - 如何使用具有不同字段的多个 Jni 包装器实例? 的相关文章

  • 使用 Nginx 时缺少 HTTP 状态代码名称

    我正在使用 Nginx 将所有 HTTP 请求重定向到 HTTPS 在我的 Spring Boot 应用程序中 这是我正在使用的 nginx 配置 通过它我可以将所有请求重定向到 Https 但是当我这样做时 我得到了状态码返回正确 但没有
  • 为什么byteArray的长度是22而不是20?

    我们尝试从字符串转换为Byte 使用以下 Java 代码 String source 0123456789 byte byteArray source getBytes UTF 16 我们得到一个长度为 22 字节的字节数组 我们不确定这个
  • 使用 google-api-java-client 的 2 足 OAuth

    有谁知道如何将 2 legged OAuth 与 google api java client 一起使用 我正在尝试访问 Google Apps 配置 API 以获取特定域的用户列表 以下不起作用 HttpTransport transpo
  • 向 JList 添加滚动条? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何将 JList 添加到 JScrollPane 把你的JList in a JScrollPane JScrollPane scrol
  • Maven 2 未运行 Junit 4 测试

    我在确保运行 Junit4 测试时遇到问题 同样的问题也被报告在https stackoverflow com questions 2021771 sort newest sort top https stackoverflow com q
  • 如何让 HttpClient 返回状态码和响应正文?

    我试图让 Apache HttpClient 触发 HTTP 请求 然后显示 HTTP 响应代码 200 404 500 等 以及 HTTP 响应正文 文本字符串 重要的是要注意我正在使用v4 2 2因为大多数 HttpClient 示例都
  • JFreeChart - 创建移动图表时出现问题

    我在我的 java 应用程序中使用 JFreeChart Problem 我想绘制一个XY面积图 whose 域轴 x 轴 当我们开始绘制数据时应该自动水平滚动 我在中看到了同样的事情时间序列图表但我不想要任何时间系列图表 我只想要滚动的
  • 如何使 ScheduledExecutorService 在计划任务取消时自动终止

    我正在使用一个ScheduledExecutorService如果网络连接已打开超过几个小时 则关闭该连接 然而 在大多数情况下 网络连接在超时之前就关闭了 所以我取消了ScheduledFuture 在这种情况下 我还希望执行程序服务终止
  • 将 RequestBody json 转换为对象 - Spring Boot

    我是 java 开发的初学者 但之前有 PHP 和 Python 等编程语言的经验 对于如何进行 Spring Boot 的开发几乎没有什么困惑 我正在开发一个rest API 它有以下请求 key value key1 value1 pl
  • 处理 ANTLR 4 中的错误

    遵循后接受的答案 https stackoverflow com a 18137301 2279200的指示处理 ANTLR4 中的错误 https stackoverflow com q 18132078 2279200问题 我遇到了以下
  • 在 Java Swing 元素中使用 HTML 样式是不好的做法吗?

    使用 HTML 设置 Swing 元素的样式被认为是不好的做法吗 举个例子 如果我想让标签变大并变红一次 我有两个选择 使用 API 调用 JLabel label new JLabel This is a title label setF
  • Java检测鼠标长按

    如果用户按下 JList 组件超过 3 秒 有什么方法可以捕获事件吗 我发现困难的部分是即使在用户松开鼠标左键之前也需要触发事件 这可以通过 mousePressed 和 mouseReleased 组合轻松完成 您可以在 mouseDow
  • 为什么java(>=7版本)不支持运行没有main方法的程序? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 class WithoutMain static System out println Without main class Sy
  • 如何发现另一个应用程序的意图

    我正在尝试构建一个应用程序来接收来自 StumbleUpon 应用程序的共享 此时 我可以接收浏览器的 共享网址 但是当从 StumbleUpon 共享时 我的应用程序不会显示在列表中 我想我可能没有在清单中注册正确的意图 有什么方法可以找
  • logcat 信息出现在 Android Studio 的“运行”选项卡中

    我的 android studio 运行选项卡很简单 然后它变得更难并给我更多信息 例如 logcat 中的信息 如何禁用或删除第二张图片中出现的更多信息并返回到第一张图片中的第一个外观 我只需要正在运行的 flutter 应用程序的日志输
  • 在 Streamreduce 方法中,求和时恒等式必须始终为 0,乘​​法时恒等式必须始终为 1?

    我继续java 8学习 我发现了一个有趣的行为 让我们看一下代码示例 identity value and accumulator and combiner Integer summaryAge Person getPersons stre
  • 从数字列表中生成所有唯一对,n 选择 2

    我有一个元素列表 假设是整数 我需要进行所有可能的两对比较 我的方法是 O n 2 我想知道是否有更快的方法 这是我在java中的实现 public class Pair public int x y public Pair int x i
  • 删除Java中重载的方法

    有2个重载方法 这些方法中的每一个都将一种类型的列表转换为不同类型的列表 但第一种方法使用比较器 class SomeClass public static
  • 混合语言源目录布局

    我们正在运行一个使用多种不同语言的大型项目 Java Python PHP SQL 和 Perl 到目前为止 人们一直在自己的私有存储库中工作 但现在我们希望将整个项目合并到一个存储库中 现在的问题是 目录结构应该是什么样的 我们应该为每种
  • 将 JSON 发送到 Spring MVC 控制器

    我正在尝试将 JSON 发送到 Spring MVC 控制器 在 Spring MVC 方面 一切都配置正确 下面是代码 但似乎没有运行

随机推荐

  • 如何检测可可中的右键单击和左键单击

    我想创建一个点击鼠标右键和左键的动作 单击可能会在 NSTableViewCell NSView 等上 就像我们右键单击窗口时会弹出一个窗口 有没有API可以完成这样的任务 如果没有 还有其他办法吗 预先感谢您对我的帮助 你必须覆盖NS响应
  • pickling 和 unpickling 用户定义的类

    我有一个用户定义的类 myclass 我将其存储在文件中pickle模块 但我在解封它时遇到问题 我有大约 20 个相同结构的不同实例 我将它们保存在不同的文件中 当我读取每个文件时 代码适用于某些文件 而不适用于其他文件 当我收到错误时
  • 计算大圆距离矩阵

    dist coords 使用欧几里得距离提供距离矩阵 它还提供了其他几个选项 但它没有提供任何选项 例如半正矢公式 distHaversine 计算给定的两组纬度 经度坐标我想要的距离 大圆 我想知道是否有一个现有的包 函数可以使用半正矢公
  • 如何在接口中公开方法而不将其公开给所有类

    我遇到一个问题 我正在使用特定的界面来处理很多事情 但是 我有一个特定的方法 我希望它仅适用于特定的一组类 基本上是一个internal方法 interface IThing function thisMethodIsPublic void
  • 无法在 Laravel 8 bootstrap 上编译 sass 文件

    当我尝试在 Laravel 版本 8 上编译引导脚手架时 出现以下错误 node modules bootstrap scss mixins grid scss 67 16 row cols node modules bootstrap s
  • Sass ID 选择器在 React 和 create-react-library 中不起作用

    我有一个正在制作的图书馆Header组件和一个Button成分 我给了他们 ID 以在我的 SASS 文件中识别他们 这是我目前的情况 index js import React from react import styles modul
  • lex & yacc 获取当前位置

    在 lex yacc 中有一个名为 YY INPUT 的宏 可以重新定义 例如以这样的方式 define YY INPUT buf result maxlen do const int n gzread gz yyin buf maxlen
  • 使用 sed 删除最后一个换行符[重复]

    这个问题在这里已经有答案了 怎么删除最后一个 n从一个文件 该文件有一个最后一个空行为最后一个文本行中的换行符创建 我正在使用这个命令 sed s d 但那个空白行没有被删除 Why is sed打印换行符 当你读到sedPOSIX标准 然
  • 在 Android 的默认媒体播放器中显示图像

    这是我的代码 首先 我录制了一个音频文件并开始播放 用于播放音频文件 play the recorded audio public void playAudio try Intent intent new Intent android co
  • 如何将 Android Studio 项目从 Windows 传输到 Mac OS X?

    我正在尝试将 Android Studio 项目从 Windows 计算机传输到 Mac 我将进入我的 Android Studio 项目 选择整个文件夹 MyApplication 然后复制到外部硬盘驱动器 当我在 Mac 上时 我尝试在
  • @ViewScoped bean 在 JSF 中如何以及何时被销毁?

    的生命周期 RequestScoped and SessionScopedBean 管理豆由 Servlet 容器本身管理 因为它们基本上存储为HttpRequest and HttpSession分别 JSF 如何管理应用程序的生命周期
  • Bing 地图 V8 - 未捕获的引用错误:Microsoft 未定义

    我在我的应用程序中使用 bing 地图进行搜索 必应地图V8控件 我用过这个CDN 之后当我尝试使用 Microsoft Maps 时 它是在说 Uncaught ReferenceError Microsoft is not define
  • zf2 在两个不同的数据库之间建立连接

    我正在尝试使用 Zend Framework 2 在放置在不同数据库中的两个表之间进行联接 第一个表称为users并存储在数据库中admin 第二个表称为等级制度并存储在数据库中customer 我在 global php 中加载数据库适配
  • ThreeJS 中 OrbitControls 中的惯性

    我正在使用 THREE OrbitControls 来旋转我的对象 不过 我想为相机旋转添加一些惯性 如果有人停止移动鼠标 相机会在一段时间后停止 我怎样才能做到这一点 这是在 OrbitControls js 中添加惯性的非常简单的方法
  • 为什么顶部和底部边距缺失? [复制]

    这个问题在这里已经有答案了 separator border 1px solid 000000 margin 10px div span hello span span class separator span span world spa
  • 如何在java中将org.w3c.dom.Element输出为字符串格式?

    我有一个org w3c dom Element对象传递到我的方法中 我需要查看整个 xml 字符串 包括其子节点 整个对象图 我正在寻找一种可以转换的方法Element转换为 xml 格式字符串 我可以System out println在
  • 重定向 POST 请求并保留数据。可能的?

    我的问题很简单 我需要将文件直接上传到正确的服务器 当前工作负载较低 因此我这样做 然后我打印我的表格
  • CodeIgniter PHP 框架 - 需要获取查询字符串

    我正在使用创建一个电子商务网站代码点火器 我应该如何获取查询字符串 我正在使用一个Saferpay支付网关 网关响应将如下所示 http www test com registration success DATA
  • 检查消息是否是从不起作用的 DM 通道类型发送的

    我正在使用 Discord js v12 并尝试检查消息是否是从 DM 发送的 但它对我不起作用 我尝试过以下方法 if msg channel type dm 几个月前这还可以 但现在就不行了 当我尝试时console log msg c
  • JNI - 如何使用具有不同字段的多个 Jni 包装器实例?

    背景 我有一个 android 项目 它使用 JNI 使用 NDK 以 Java 和 C C 进行编码 我在java端创建了一个Jni java包装器 它将自己完成所有Jni操作 而除了这个包装器之外 没有其他java类可以直接访问jni操