使用IKVMC转换Jar为dll动态库

公司的一个Net项目要做一个加密解密文件的模块。也许是同事忙不过来了,想要Java这边帮忙搞一个模块然后转换成DLL给C#那边进行调用!面向网络编程(滑稽)后发现有一个工具可以搞定这个需求: IKVMC

说明一下本人当前使用的环境:

  1. Java使用的集成编译环境是 IDEA 2019 3.4
  2. IKVMC版本要求需要和Java编译的版本一致:
    1. IKVMC 7.x 版本对应JDK 1.7 (这里用的是这一套)
      1. 下载地址:ikvmbin-7.2.4630.5
    2. IKVMC 8.x 版本对应JDK 1.8
      1. 下载地址:ikvmbin-8.1.5717.0

安装配置IKVMC环境:

由于公司过往Net项目C#调用的是Java 1.7编译的jar后转化的DLL文件,所以本次使用上面提到的第一套环境方案: ikvmbin-7.2.4630.5JDK 1.7

  1. 按照上面地址下载好IKVMC压缩包后解压到你喜欢的任意目录。这里是:D:\soft\ikvm-7.2.4630.5
    使用IKVMC转换Jar为dll动态库_第1张图片
  2. 然后打开系统的环境变量配置:鼠标右键 计算机–>属性–>高级系统设置–>环境变量–>找到Path环境变量并打开,在后面添加IKVMC安装目录:D:\soft\ikvm-7.2.4630.5\bin; 注意前后的英文 “;” 分号。配置好后,确定关闭对话框!
    使用IKVMC转换Jar为dll动态库_第2张图片
  3. 验证IKVMC环境:打开cmd,输入命令:ikvmc 看到以下信息就说明配置IKVMC的环境配置OK! 标红的是IKVMC版本及其使用命令!
    使用IKVMC转换Jar为dll动态库_第3张图片

Jar打包:

配置编译版本:
。。。略过Java这边的加密解密代码编写,直接到打包jar这一步。因为配置的 ikvmc7.x 版本, 所以编译需要的是 JDK 1.7:按下面步骤打开:

使用IKVMC转换Jar为dll动态库_第4张图片

上面打开方式也可使用默认快捷方式:Ctrl+Shift+Alt+S(或者菜单:File -> Project Structure)。
需要说一个特别问题:上面的是配置项目总环境,但还需要确认一下另一个位置编译版本配置, 默认快捷方式:Ctrl+Alt+S( 或菜单:File -> Settings),打开界面:

使用IKVMC转换Jar为dll动态库_第5张图片

配置好Java编译版本之后,正式进入Jar打包流程:
  1. 快捷方式 Ctlr+Shift+Alt+S 打开 Project Structure

  2. 点击 Artifacts --> 点击 +号 -->选中JAR --> From Modules with de…

使用IKVMC转换Jar为dll动态库_第6张图片

  1. 弹出如下窗口:

使用IKVMC转换Jar为dll动态库_第7张图片

 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文件!(这里没有截图)
  1. 配置jar打包的输出目录:红框标识位置是可以改的! Output directory项为jar包输出目录! Name项?实验了一下,其实他并不是输出的jar文件名字!

使用IKVMC转换Jar为dll动态库_第8张图片

  1. 如果要修改输入Jar的文件名字,在这个位置(修改Module名字)。留意上面的截图,我是改掉了Module名字的:

使用IKVMC转换Jar为dll动态库_第9张图片

经过以上步骤之后,我们就可以进行Jar打包了!

  1. 点击菜单:Build --> Build Artifacts
    使用IKVMC转换Jar为dll动态库_第10张图片
  2. 在弹出的窗口选中目标jar,然后Build:

使用IKVMC转换Jar为dll动态库_第11张图片

  1. 等待编译打包,然后再上面配置的Jar输出目录就可以找到输出的Jar了:

使用IKVMC转换Jar为dll动态库_第12张图片

得到Jar后,进入Jar转DLL流程:
  1. 打开cmd,进入目标jar文件所在目录,输入命令
  2. ikvmc FileEncryptor.jar -out:FileEncryptor.dll

使用IKVMC转换Jar为dll动态库_第13张图片

  1. 转换过程如果有警告,那就是失败,即使生成了目标文件(给C#调用是无效的!)
  2. 命令还可以这样打: ikvmc -out:FileEncryptor.dll FileEncryptor.jar 命令解释 -out 后面是输出的DLL文件名,后面的是需要转换的jar文件! 注意命令中的空格。

打包成DLL可以给Net项目使用了!

但是要注意:转化Jar为DLL使用的是IKVMC工具,所以,调用目标DLL还需要IKMVC的DLL支持。IKVMC的DLL文件在安装目录的bin文件夹下:

使用IKVMC转换Jar为dll动态库_第14张图片

具体需要哪些DLL文件呢,总不能全部都用吧?这个时候就需要用到DLL反编译工具的支持了! 这里我使用的 dnSpy,这里就不提供下载地址了,自己上网搜索一个下载下来就可以了!

下载安装打开dnSpy后,使用软件打开之前生成的DLL文件
使用IKVMC转换Jar为dll动态库_第15张图片

我们可以清晰的看到该DLL引用了

1. IKVM.OpenJDK.Core
2. IKVM.OpenJDK.Security
3. IKVM.OpenJDK.SwingAWT
4. IKVM.Runtime

所以本项目在提供生成的DLL给Net项目使用的时候,还需要把上述4个IKVMC文件一起发给Net项目使用,由Net项目人员引用这些动态支持库!!如果你们的反编译得出不一样的结果,那么要按照实际的来┗( ▔, ▔ )┛,这里我只提供一下思路!!!

你可能感兴趣的:(Java)