关于Java 加载dll

   最新写了一个关于Foxbpm设计器插件使用SQLite数据库,有关Foxbpm设计器插件详情请参考github官方https://github.com/FoxBPM/FoxBPM-Designer

   期初在网上下载了一个SQLite的jar和一个dll,发现Foxbpm设计器插件如果要使用SQLite,就要让插件能够加载到该dll,而且根据项目要求该dll最终是要放到插件包中,这样就有遇到一个问题,如何让Eclipse插件加载jar包中dll,后来在网上搜索”关于Eclipse插件加载dll"

(http://hi.baidu.com/eulxzyvuetaluve/item/d8b6901f57c9074be65e065b),发现可以在以相对plugin根目录的指定目录(ws/win32.os/win32/x86,os/win32/,nl/zh/CN,nl/zh/)中放置dll就可以了实现自动加载,但是我们这个Foxbpm设计器插件是要面向多系统的,刚开始在windows下我在Foxbpm设计器插件根目录下创建os/win32,并将dll文件放置该目录通过System.loadLibrary("sqlite_jni");是可以加载成功,但是发现在mac系统上不知道如何在Foxbpm设计器插件根目录的指定相应目录了。

   最后直接到SQLite官方(http://www.sqlite.org/download.html)下载一个包含dll的驱动包sqlite-jdbc4-3.8.2-SNAPSHOT,里面包含windows,mac,liunx系统下的dll文件,从而实现了Foxbpm设计器在mac系统下使用SQLite数据库
   
 

最后自己总结了下java加载dll

1、在java.library.path(加载库时搜索的路径列表)下加载dll

//加载java.library.path下的dll
System.loadLibrary("WindowsCommand");
注意不需要带上文件名后缀

 2、在绝对目录下加载dll

//加载d:\\目录下的dll
System.load("d:\\WindowsCommand.dll");
注意需要带上文件全路径

    3、下面介绍一种,如何加载jar中的dll

	InputStream in = null;
	OutputStream out = null;
	try {
		URL url = TestLoadDll.class.getClassLoader().getResource("WindowsCommand.dll");
		if (null != url) {
			File f = new File(url.toURI());
			String tempPath = System.getProperty("java.io.tmpdir");
			// 将jar包中的dll资源,在默认的临时文件路径下重新生成dll文件
			File tempFile = new File(tempPath + "hello.dll");
			in = url.openStream();
			out = new FileOutputStream(tempFile);
			byte[] bytes = new byte[1024];
			while (in.read(bytes) != -1) {
				out.write(bytes);
			}
			out.flush();
			out.close();
			// System.getProperty("java.io.tmpdir");临时目录下加载dll
			System.load(tempFile.getAbsolutePath());
		}
	} catch (Exception e) {
	} finally {
		if (null != in) {
			try {
				in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		if (null != out) {
			try {
				out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

 

   以上代码在我本机执行,会在C:\Users\yangguang\AppData\Local\Temp目录下生成hello.dll文件

  上面代码思想是,首先将通过类加载器获取包中dll资源,同时在 java.io.tmpdir临时目录下生成hello.dll文件,然后将获取的dll资源写入生成的临时文件中,最后通过System.load(tempFile.getAbsolutePath());方式加载。

 

 

 

 

 

Java加载由 C++ 生成的 DLL 接口,通常使用 JNI(Java Native Interface)机制实现。具体步骤包括声明 native 方法、生成 C/C++ 头文件、实现 C++ 接口并编译为 DLL 文件,最后通过 Java 代码加载DLL 并调用其功能。 ### 声明 Native 方法并加载 DLLJava 代码中定义一个类,并在其中声明 `native` 方法,表示这些方法将由本地代码实现。通过 `System.loadLibrary` 加载生成的 DLL 文件,确保 JVM 能够找到并链接到对应的本地函数。 ```java public class Java2cpp { static { System.loadLibrary("javaCallcpp"); // 加载生成的 DLL 文件 } public native int add(int a, int b); // 声明本地方法 public static void main(String[] args) { Java2cpp example = new Java2cpp(); int result = example.add(5, 3); System.out.println("Result: " + result); } } ``` ### 生成 C/C++ 头文件 使用 `javac` 编译 Java 类,并通过 `javah` 工具生成对应的 C/C++ 头文件。该头文件包含 JNI 函数签名,用于 C++ 实现。 ```bash javac Java2cpp.java javah -jni Java2cpp ``` 生成的头文件内容类似如下: ```c JNIEXPORT jint JNICALL Java_Java2cpp_add(JNIEnv *, jobject, jint, jint); ``` ### 实现 C++ 接口并编译为 DLL 在 C++ 中实现头文件定义的函数,并使用支持 JNI 的编译器将其编译为 DLL 文件。以下是一个示例实现: ```cpp #include <jni.h> #include "Java2cpp.h" JNIEXPORT jint JNICALL Java_Java2cpp_add(JNIEnv *env, jobject obj, jint a, jint b) { return a + b; } ``` 使用 g++ 编译生成 DLL 文件: ```bash g++ -shared -o javaCallcpp.dll -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" Java2cpp.cpp ``` ### 加载 DLL 并运行 Java 程序 确保生成的 DLL 文件位于 `java.library.path` 或系统路径中,然后运行 Java 程序。Java 会通过 `System.loadLibrary` 加载 DLL,并调用本地方法实现功能[^1]。 ```bash java Java2cpp ``` 程序输出: ``` Result: 8 ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值