4

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

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

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

答案
必须是:

  • 简单化
  • 快速地
  • 跨平台

谢谢你的时间!

4

2 回答 2

1

private int mNativeObj您可以在 Java 对象中创建一个变量,以及一个保存本机指针的方法,例如public void setNativeObject(int pointer). 在 C 代码中,调用CallVoidMethod()以保存指向 Java 对象的指针。您可以参考Oracle 的文档

于 2013-08-22T09:43:26.460 回答
1

由于您要传递批量数据,我建议使用直接的 ByteBuffer。这是一个从 Java 进入本机内存的窗口。即,一旦您写入 ByteBuffer,它就已被复制到本机内存。从 C 中,您可以获得地址并将其用作指向不会移动的内存的指针。

如果您只需要跨操作系统,但您使用的是基于 OpenJDK 的 JVM,则可以使用 Unsafe 通过地址直接访问本机内存(就像指针一样)。我建议你把它包在类中并彻底测试它。

于 2013-08-22T09:08:46.197 回答