java - 如何在 Java 中调用 OpenSSL 方法?

标签 java android openssl java-native-interface

我必须在 java 中调用 openssl 方法,例如 android.external.openssl.crypto.pkcs7.PKCS7_encrypt() 方法。我发现没有 JNI 实现。所以我必须写JNI层。 如果我错了,请纠正我。

所以我学习了基本的 JNI。我发现如果我想在 java 中调用一个方法,例如 search(),那么 C 中的方法定义将类似于 Java_packageNameOfJavaFile_JavaClassName_method()。 Mehotd 名称表示,必须在为 native 方法创建头文件(*.h 文件)后完成 c/c++ 库实现。

我的困惑是如果我想使用内置库(openssl 库)那些方法不包括如上所述的命名约定,那么我应该如何在 Java 中调用这些方法。

最佳答案

基本上,您不会使用 JNI 从 Java 调用现有库;您创建一个新的共享库,导出 JNI 兼容函数,这些函数恰好使用您实现它们所需的任何库。

要使用 JNI,您:

  1. 为您需要的功能确定一个自然的、以 Java 为中心的模型(类和方法)
  2. 在方法声明中添加native
  3. 使用javac将.java文件编译成.class文件
  4. 在类上运行javah,传递类路径,这类似于运行java
  5. 执行发送到 header 中的 C 函数。 (您可以使用 C 或 C++ 语法)
  6. 如果函数实现需要许多 Java 类型转换或 JNI 代码中的其他操作,返回 Java 类并在那里进行操作,将 native 移动到 private比原来以 Java 为中心的方法更容易在 JNI 代码中实现的方法。 (这方面的一个例子是字符串操作,其中实现可以更容易地将 Java String 作为 Java byte[] 使用所需的字符集/编码你使用的图书馆)

函数实现通常遵循输入-处理-输出模式:将数据从Java参数转换为C/C++数据类型,调用库函数进行处理,再将数据从C/C++数据结构转换为Java返回对象.

您还可以使用 JNI 代码创建 Java 对象、调用方法并显式抛出 Java 异常。

请始终注意,JNI 调用可能会将 Java 异常抛入 JVM,在这种情况下,您需要在 C/C++ 代码中进行检查和分支。当你想抛出异常时,你应该停止调用其他 JNI 函数,清理并退出该函数。

当然,必须捕获并适当处理所有 C++ 异常。


替代方案(实际上在幕后使用 JNI):

  1. 痛饮
  2. JNA,JNAerator

这些采用相反的方法:采用(有时是简化的或带注释的)C 或 C++ header 并创建调用其中定义的函数的代码。然后,您可能会围绕它构建一个 Java 模型,以便更自然地调用您的应用程序代码。

关于java - 如何在 Java 中调用 OpenSSL 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23082235/

相关文章:

java - 从字符串中的 href 标签中提取特定地址始终以 .jpg 结尾

java - 如何将一些文件添加到播放列表中

java - Android 上未显示 Google map 。只有谷歌标签

ssl - 如何连接到安全网站 (https :)?

java - JFrame从自定义按钮拖动不流畅

java - 如何在 SourceViewer 中显示查找替换对话框(快捷键 Ctrl+F)

android - 应用程序使应用程序屏幕变慢

android - 从 channel 网址中提取YouTube channel ID-Android

ruby-on-rails - 找不到有效的 gem : certificate verify failed

Qt 4.7 SSL 错误 : "The certificate has expired”