【问题标题】:How to call OpenSSL methods in Java?如何在 Java 中调用 OpenSSL 方法?
【发布时间】:2014-04-15 11:23:15
【问题描述】:

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

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

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

【问题讨论】:

  • "如何在 Java 中调用 OpenSSL 方法?" - 不!使用另一个加密库。
  • 为什么? Java 中内置了很多加密。你可能不需要任何外部的东西,如果你这样做了,它可能会在 BouncyCastle 中找到。
  • 使用 javah 创建 Java 错位名称。
  • EJP - 他可能需要 FIPS。据我所知,没有一个免费的 Java 加密库提供它。那些不是免费的,可能会被美国间谍机构(RSA Data Security 的 BSAFE)渗透。
  • @jww 他可能会,也可能不会。由他来告诉我们。我对猜测不太感兴趣。

标签: java android openssl java-native-interface


【解决方案1】:

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

要使用 JNI,您:

  1. 为您需要的功能确定一个自然的、以 Java 为中心的模型(类和方法)
  2. 在方法声明中添加native
  3. 使用javac将.java文件编译成.class文件
  4. 在类上运行javah,传递一个类路径,类似于运行java
  5. 实现发出到标头中的 C 函数。 (您可以使用 C 或 C++ 语法)
  6. 如果函数实现需要在 JNI 代码中进行许多 Java 类型转换或其他操作,请返回 Java 类并在那里进行操作,将 native 移动到 private 方法,这比在 JNI 代码中更容易实现原始的以 Java 为中心的方法。 (这方面的一个例子是字符串操作,在这种情况下,实现可以更轻松地将 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++ 标头并创建调用其中定义的函数的代码。然后,您可以围绕它构建一个 Java 模型,以便更自然地调用您的应用程序代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-09
    • 2013-12-26
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    相关资源
    最近更新 更多