java调用第三方dll文件

网上调用第三方dll组件的方法有很多,作者是通过jna进行调用的,试过com组件封装但是组件,但是一直没有成功,感兴趣的可以试试。
那么首先说一下思路:

思路1

因为是.net的dll文件(net.dll),故无法直接使用jna进行调用,所以作者的思路是将net.dll用c++先引入后,再做成一个c++的dll,供java使用jna直接调用。

  1. 用C++封装外部dll,这里假设已经有.net的dll文件了,我们直接开始使用C++对net.dll进行封装
    创建C++中间件1

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    下面我们将调用代码写一下,其中我的EncryptLib.dll中存在两个类文件,并提供一个方法,用于外部调用的方法名为EncryptPwd是一个传入两个文本值,返回一个秘钥文本的工具

#ifdef MYLIBAPI
#else
#define MYLIBAPI extern "C" __declspec(dllimport)
#endif
MYLIBAPI char* MethodGet(char *name,char *key); //添加函数声明,此函数为生成的C++的dll的外部公开函数
using namespace System;
using namespace EncryptLib;//添加引入的C#的dll名称
 
 
char* MethodGet(char *name,char *key)
{
	String ^ a = gcnew String(name);//需要将char *转换为托管的String类型,否则失败
	String ^ b = gcnew String(key);//需要将char *转换为托管的String类型,否则失败
	EncryptFunc ^method = gcnew EncryptFunc();//实例化C#的类即EncryptLib中的类文件
	String ^resultString=method->EncryptPwd(a, b);//调用C#的dll中的方法
	char* result =(char*)(void*)System::Runtime::InteropServices::Marshal::StringToCoTaskMemAnsi(resultString);
	return result;
}

代码编写成功后,右键项目,选择生成,即可生成dll文件
在这里插入图片描述

  1. 使用java调用c++的dll
    将dll文件放入指定目录中,如“D:\server\Win32Project1.dll”,并将net.dll(即原始dll)放入到jdk的bin目录下,如:C:\ProgramFiles\Java\jdk1.7.0_80\bin的目录下,打开eclipse,新建项目,创建java文件,代码如下
package myGetPass;
import com.sun.jna.Library;
import com.sun.jna.Native;

public class Encrypt {
	//使用main方法进行调用即可
	public static void main(String[] args) throws Exception{
		String methodGet = getPass.instanceDll.MethodGet("154646","46549879788");
		System.out.println(methodGet);
		}

	interface getPass extends Library{
		getPass instanceDll=(getPass) Native.loadLibrary("D:\\server\\Win32Project1.dll",getPass.class);
		//getPass即当前接口名称,loadLibrary方法,第一个参数为C++的dll路径,并将其中的方法给到getPass这个接口
		
		//这个地方填写C++中定义的方法名称及返回值
        String MethodGet(String name, String key);
	}
}
  1. 注意事项:
    1.jdk和c++生成的dll保持一致,即都是64位,或都是32位
    2.需要将原生的net.dll放置到jdk的bin目录下
    3.java方面需要引入jna的jar包,笔者使用的是jna-3.5.1.jar

思路2

用C++将dll引用,然后封装成一个.exe文件,使用java的Runtime.getRuntime().exec()这种方式对exe文件进行调用,并拿到返回值
C++部分代码如下

#include <stdio.h>
#include <stdlib.h>
using namespace System;
using namespace PMTEncryptLib;//添加引入的C#的dll名称
 
 
void main(int argc,char *argv[])
{
	String ^ a = gcnew String(argv[1]);//需要将char *转换为托管的String类型,否则失bai
	String ^ b = gcnew String(argv[2]);//需要将char *转换为托管的String类型,否则失败
	EncryptFunc ^method = gcnew EncryptFunc();//实例化C#的类
	String ^resultString=method->EncryptPwd(a, b);//调用C#的dll中的方法
	char* result =(char*)(void*)System::Runtime::InteropServices::Marshal::StringToCoTaskMemAnsi(resultString);
	printf(result);
}

java部分的代码如下

    public static String  getKey(String exePath,String name,String pass)throws Exception{
    	//此处依次输入可执行文件的路径,及参数即可,
    	//由于本人的exe文件需要给定两个值,故cmdarr中除路径外,其他还有两个参数
        String[] cmdArr = new String[]{exePath, name,pass};
        Process process = Runtime.getRuntime().exec(cmdArr);
//        int ret = process.waitFor();

        InputStreamReader inputStr = new InputStreamReader(process.getInputStream());
        BufferedReader br = new BufferedReader(inputStr);
        String result=null;
        String temp = "";
        while((temp = br.readLine())!= null){
            result=temp;
        }
        process.destroy();
        br.close();
        inputStr.close();
        return result;
    }

希望能帮到大家!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 要在64位JDK环境下调用32位DLL文件,您需要执行以下步骤: 1. 确定您的操作系统是否为64位,如果是,请下载并安装32位Java运行时环境(JRE)。 2. 在32位Java JRE中编写代码,以便它可以调用32位DLL文件。请注意,由于32位DLL文件不受64位Java JRE支持,因此必须使用32位Java JRE。 3. 将32位DLL文件复制到您的计算机上,并确保它们位于Java可以找到的位置。可以将其复制到Java库路径或系统路径中。 4. 将32位DLL文件Java代码连接起来。您可以使用Java Native Interface(JNI)来实现这一点。 JNI允许Java代码调用本地库(如DLL文件),并且可以在32位Java JRE和64位Java JRE中使用。 5. 在Java代码中使用System.loadLibrary()函数来加载32位DLL文件。 6. 测试您的代码并确保它可以正确调用32位DLL文件。 ### 回答2: 在64位JDK环境中调用32位DLL文件的问题可以通过以下步骤解决: 1. 确认操作系统:首先需要确保操作系统是64位版本的。如果操作系统是32位的,那么无论使用哪个版本的JDK,都只能调用32位DLL文件。 2. 安装32位JDK:在64位JDK环境中调用32位DLL文件,需要安装32位的JDK。因为32位DLL文件是由32位JDK生成的,所以只有相同位数的JDK能够正确地加载并调用DLL文件。 3. 配置环境变量:将32位JDK的安装路径添加到系统的环境变量中。这样,可以确保在命令行或其他开发工具中使用32位JDK进行编译和运行程序。 4. 设置Java库路径:在Java代码中,使用System.setProperty("java.library.path", "DLL文件路径")指定DLL文件的路径。这样,JVM会在指定的路径中找到并加载32位DLL文件。 5. 使用32位JRE:如果使用的是JRE而不是JDK,同样需要安装32位的JRE,并在环境变量中配置正确的JRE路径。 需要注意的是,64位JDK环境中调用32位DLL文件可能会导致兼容性问题。因此,建议尽可能使用相同位数的JDK和DLL文件。如果DLL文件是由第三方提供的,可以尝试联系DLL文件的提供方,获取64位版本的DLL文件。 总结起来,解决64位JDK环境中调用32位DLL文件的问题,需要确认操作系统位数,安装相同位数的JDK或JRE,并配置正确的环境变量和Java库路径。 ### 回答3: 要在64位JDK环境中调用32位DLL文件,我们需要采取以下解决方法: 1. 选择32位JDK环境:如果可能的话,可以考虑安装32位JDK环境,因为32位JDK环境能兼容32位DLL文件。这样就可以直接使用32位JDK环境调用32位DLL文件,无需做其他处理。 2. 使用Java Native Interface(JNI):JNI是Java提供的一种机制,允许Java代码调用本地语言的函数。通过编写桥接函数,将Java代码与DLL文件连接起来。在编写JNI函数时,需要根据DLL文件调用规范(例如C调用规范)进行适当的声明和封装。 3. 使用Java Native Access(JNA)库:JNA是一个开源库,可以简化Java调用本地函数的过程。通过使用JNA库,在Java代码中声明和定义DLL文件的函数和数据结构,使得可以直接调用32位DLL文件中的函数。在JNA中,没有必要编写JNI函数,而是通过直接调用DLL文件的函数来实现功能。 4. 通过进程间通信(IPC):如果以上方法都无法解决问题,可以考虑通过IPC与一个32位进程进行通信。在32位进程中加载32位DLL文件,并提供接口让64位JDK环境中的Java代码调用。可以使用进程间通信机制,如共享内存或管道,实现Java代码与32位进程之间的数据交换和通信。 以上是解决64位JDK环境中调用32位DLL文件的一些方法。根据具体情况选择适合的解决方案,并根据需求进行详细实施和测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灵湖映北辰

年轻人,要讲武德!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值