openssl的安装及在Java语言的工程中使用
OpenSSL的安装及在Java语言的工程中的使用
OpenSSL的安装
1. OpenSSL源码下载
OpenSSL的下载链接,点击可以进入相应的下载页面 OpenSSL的Downloads
OpenSSL官网没有提供windows版本的安装包,可以选择第三方提供的安装包,也可以自己下载源码进行编译安装,第三方的下载链接为: Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions (slproweb.com)
进入官方的下载页面后可以看到如下:
OpenSSL的3.0版本和1.1.x版本的区别:
- OpenSSL 3.0是 OpenSSL 的最新主要版本;
- 1.1.x 系列是OpenSSL的长期支持(LTS)版本,支持到2023年9月11日。
我们下载3.0版本的源码,然后自己编译完成安装。
我将源码放置到目录:C:\openssl\openssl-3.0.3
2. Perl安装
编译OpenSSL需要安装Perl环境,如何安装Perl可以看一下菜鸟教程的: Perl 环境安装 |菜鸟教程 (runoob.com) 。
进入 Perl Download - www.perl.org,选择 strawberry-perl下载。
无脑点击下一步,然后cmd输入perl -v,能看到如下画面,说明已经成功啦!
3.编译安装OpenSSL
少装以下两个库,可能会导致nmake失败。
# 安装这两个库
perl -MCPAN -e "install Test::More"
perl -MCPAN -e "install Text::Template"
需要先下载Visual Studio,本人安装的是Visual Studio 2022社区版。
安装完Visual Studio之后,点击“视窗图标”,然后选择“visual studio command prompt”。
执行以下命令行:
cd C:\openssl\openssl-3.0.3
perl Configure debug-VC-WIN64A no-shared no-tests no-asm --prefix="C:\opensslbin"
nmake
nmake install
nmake结束时的截图:
nmake install结束时的截图:
进入:C:\opensslbin可以看到如下图,说明安装基本已经成功。
cmd中执行如下命令:
cd C:\opensslbin\bin
openssl -help
如果看到上图的输出,则说明openssl安装已经成功。
OpenSSL在Java工程中的使用
OpenSSL使用C/C++进行编写,因此效率很高。但是如果做上层的工程应用,Java编程语言则更加擅长。
JNI是一种在Java中使用C/C++的过程或者函数的Java接口。
Java通过JNI和C/C++语言编译出来的dll的交互示意图,具体可以看 详解JNI到底是什么_java_脚本之家 (jb51.net) 。
第一步,新建一个Java项目,名字叫做SimpleHello,包名叫做com.study.jni.demo.simple,新建一个SimpleHello的类,然后里面的代码为:
package com.study.jni.demo.simple;
public class SimpleHello {
public static native String sayHello(String name);
public static void main(String[] args) {
String name = "wkm";
String text = sayHello(name) + "";
System.out.println("after native, java shows:" + text);
}
static {
// hello.dll要放在系统路径下,比如C:\windows\
System.loadLibrary("hello");
}
}
第二步,打开SimpleHello.java所在的目录,然后文件目录栏上输入cmd回车,输入以下命令:
# 注意最后有一个“点”
javac SimpleHello.java -h .
此时可以看到,当前目录下会生成两个文件:
- SimpleHello.class
- com_study_jni_demo_simple_SimpleHello.h
第三步,在VS2022里创建一个dll工程,名字叫做hello,并将文件com_study_jni_demo_simple_SimpleHello.h复制粘贴放置到该工程目录下,也就是和其它.cpp和.h文件相同的目录。
然后,项目中头文件->右键->添加->现有项,选择刚才的那个com_study_jni_demo_simple_SimpleHello.h文件。
第四步,在hello.cpp文件中输入如下代码:
#include <jni.h>
#include <stdio.h>
#include "string.h"
#include "com_study_jni_demo_simple_SimpleHello.h"
JNIEXPORT jstring JNICALL Java_com_study_jni_demo_simple_SimpleHello_sayHello(JNIEnv* env, jclass cls, jstring j_str)
{
const char* c_str = NULL;
char buff[128] = { 0 };
jboolean isCopy;
c_str = env->GetStringUTFChars(j_str, &isCopy);
if (c_str == NULL) {
printf("out of memory.\n");
return NULL;
}
printf("From Java String:addr: %x string: %s len: %d isCopy: %d\n",
c_str, c_str, strlen(c_str), isCopy);
sprintf_s(buff, "hello %s", c_str);
env->ReleaseStringUTFChars(j_str, c_str);
printf("Hello world!/n");
return env->NewStringUTF(buff);
}
此时,#include <jni.h>会报红,这是因为没有引入jni的库,这个库安装jdk时就有,把相关目录引入进行就行。
具体步骤是,在hello项目上点右键->属性->C/C++->常规->附加包含目录。
然后输入以下两个:
%JAVA_HOME%\include\win32
%JAVA_HOME%\include
点确定然后点应用,可以发现#include <jni.h>不报红。
第五步,在hello项目点击右键,点击生成,此时在项目的文件目录hello\x64\Debug下可以找到一个名叫hello.dll的文件。将其复制粘贴到C:\Windows目录下。
第六步,此时回到Java项目,运行该项目,可以看到如下输出,则说明运行成功。