公司的一个Net项目要做一个加密解密文件的模块。也许是同事忙不过来了,想要Java这边帮忙搞一个模块然后转换成DLL给C#那边进行调用!面向网络编程(滑稽)后发现有一个工具可以搞定这个需求: IKVMC
说明一下本人当前使用的环境:
- Java使用的集成编译环境是 IDEA 2019 3.4
- IKVMC版本要求需要和Java编译的版本一致:
- IKVMC 7.x 版本对应JDK 1.7 (这里用的是这一套)
- 下载地址:ikvmbin-7.2.4630.5
- IKVMC 8.x 版本对应JDK 1.8
- 下载地址:ikvmbin-8.1.5717.0
安装配置IKVMC环境:
由于公司过往Net项目C#调用的是Java 1.7编译的jar后转化的DLL文件,所以本次使用上面提到的第一套环境方案: ikvmbin-7.2.4630.5 和 JDK 1.7
- 按照上面地址下载好IKVMC压缩包后解压到你喜欢的任意目录。这里是:D:\soft\ikvm-7.2.4630.5
- 然后打开系统的环境变量配置:鼠标右键 计算机–>属性–>高级系统设置–>环境变量–>找到Path环境变量并打开,在后面添加IKVMC安装目录:D:\soft\ikvm-7.2.4630.5\bin; 注意前后的英文 “;” 分号。配置好后,确定关闭对话框!
- 验证IKVMC环境:打开cmd,输入命令:ikvmc 看到以下信息就说明配置IKVMC的环境配置OK! 标红的是IKVMC版本及其使用命令!
Jar打包:
配置编译版本:
。。。略过Java这边的加密解密代码编写,直接到打包jar这一步。因为配置的
ikvmc 是
7.x 版本, 所以编译需要的是
JDK 1.7:按下面步骤打开:
上面打开方式也可使用默认快捷方式:Ctrl+Shift+Alt+S(或者菜单:File -> Project Structure)。
需要说一个特别问题:上面的是配置项目总环境,但还需要确认一下另一个位置编译版本配置, 默认快捷方式:Ctrl+Alt+S( 或菜单:File -> Settings),打开界面:
配置好Java编译版本之后,正式进入Jar打包流程:
- 快捷方式 Ctlr+Shift+Alt+S 打开 Project Structure
- 点击 Artifacts --> 点击 +号 -->选中JAR --> From Modules with de…
- 弹出如下窗口:
1. 选择需要打包Jar的Module;
2. 然后"Main Class"项选择该Module下想要打包jar的Java类;
3. JAR files from libraries 选项:
1. 第一项提取到目标JAR,也就是说:如果目标类引用了其他类,甚至其他jar中的类,打包jar的时候会打包进同一个Jar!
2. 第二个选项是复制到输出目录并通过清单链接,也就是说,引用的jar还是独立jar,不会直接打包进目标jar合为一个文件。当需要使用生成的jar的时候,如果该jar依赖第三方jar,那么第三方jar也要一起拷贝才能使用!
3. 综上,为了方便我们选择第一个选项。
5. Directory for META- INF/MANIFEST.MF: 尽量选择非源码src目录
6. 选择后按确定,会看到Directory for META- INF/MANIFEST.MF项选中的目录中多出了一个META-INF目录,里面有一个MANIFEST.MF文件!(这里没有截图)
- 配置jar打包的输出目录:红框标识位置是可以改的! Output directory项为jar包输出目录! Name项?实验了一下,其实他并不是输出的jar文件名字!
- 如果要修改输入Jar的文件名字,在这个位置(修改Module名字)。留意上面的截图,我是改掉了Module名字的:
经过以上步骤之后,我们就可以进行Jar打包了!
- 点击菜单:Build --> Build Artifacts
- 在弹出的窗口选中目标jar,然后Build:
- 等待编译打包,然后再上面配置的Jar输出目录就可以找到输出的Jar了:
得到Jar后,进入Jar转DLL流程:
- 打开cmd,进入目标jar文件所在目录,输入命令
- ikvmc FileEncryptor.jar -out:FileEncryptor.dll
- 转换过程如果有警告,那就是失败,即使生成了目标文件(给C#调用是无效的!)
- 命令还可以这样打: ikvmc -out:FileEncryptor.dll FileEncryptor.jar 命令解释 -out 后面是输出的DLL文件名,后面的是需要转换的jar文件! 注意命令中的空格。
打包成DLL可以给Net项目使用了!
但是要注意:转化Jar为DLL使用的是IKVMC工具,所以,调用目标DLL还需要IKMVC的DLL支持。IKVMC的DLL文件在安装目录的bin文件夹下:
具体需要哪些DLL文件呢,总不能全部都用吧?这个时候就需要用到DLL反编译工具的支持了! 这里我使用的 dnSpy,这里就不提供下载地址了,自己上网搜索一个下载下来就可以了!
下载安装打开dnSpy后,使用软件打开之前生成的DLL文件
我们可以清晰的看到该DLL引用了
1. IKVM.OpenJDK.Core
2. IKVM.OpenJDK.Security
3. IKVM.OpenJDK.SwingAWT
4. IKVM.Runtime
所以本项目在提供生成的DLL给Net项目使用的时候,还需要把上述4个IKVMC文件一起发给Net项目使用,由Net项目人员引用这些动态支持库!!如果你们的反编译得出不一样的结果,那么要按照实际的来┗( ▔, ▔ )┛,这里我只提供一下思路!!!