java - 如何将 C 变量 (JNI) 存储到 Java 类实例

标签 java c java-native-interface

背景
我的应用程序现在已达到瓶颈,其中最慢的部分是所有数据都必须通过的 AES 加密和解密流。为了克服这个问题,我计划通过 JNI 和 OpenSSL 在 native 代码中实现这种加密,这样我就可以利用 AES-NI 和直接内存访问之类的东西(我的缓冲区已经是直接的,所以我已经可以获得指向它们的指针内存区域)

问题
每次我需要加密或解密某些数据时,用 key 重新创建 OpenSSL 密码是没有意义的。如果我使用 Java,我会简单地将密码实例存储为类中的一个字段,但是由于密码是一个 C“对象”,我不能这样做。

问题
如何将 C“对象”绑定(bind)到 Java 类实例,以便后续调用可以使用存储的“对象”。我想这与将“对象”指针作为 long 存储到 Java 类中,然后取消引用它有关,但是我不太确定这是否完全跨平台。

答案
必须是:

  • 简单
  • 跨平台

感谢您的宝贵时间!

最佳答案

你可以在Java Object中创建一个变量private int mNativeObj,以及一个保存native指针的方法,比如public void setNativeObject(int pointer)。在 C 代码中,调用 CallVoidMethod() 来保存指向 Java Object 的指针。可以引用Oracle's doc .

关于java - 如何将 C 变量 (JNI) 存储到 Java 类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18375874/

相关文章:

android - 使用 Android 原生 Binder 发送自定义对象

java - 使用 GetEnv() 获取环境失败

java - 参数化类的 Hibernate 映射

c - 在多线程应用程序中使用基于 openssl 的 pbkdf2

c - 为什么这个代码在 Big Oh 表示法中被认为是 O(N^6)?

c - 如何在 C 中比较两个字符串而忽略换行符?

java - 生成java头文件时出错

java - 如何将图像拆分为多个较小的图像

java - 使用 Apache CXF 的文件传输 Web 服务

java - Solrj - 由于 HTTPSolrServer 无法继承最终类错误