java调用.dll文件

.在程序用jnative调用windowdll

1.   安装

http://sourceforge.net/projects/jnative

解压后得到3个文件:JNativeCpp.dlllibJNativeCpp.soJNative.jar,其中:

JNativeCpp.dll     放在windows/system32目录下

libJNativeCpp.so    linux下使用

JNative.jar          导入工程中

2.   使用

2.1.     加载dll文件

JNative可使用两种方式加载dll文件:

a.使用System.loadLibrary加载,使用此方法可加载系统目录中的dll文件。

b.可以先把dll文件复制到system32目录下,使用文件前缀名作为参数来加载dll文件。使用System.load加载,此方法参数为dll文件全路径名。

2.2.     调用函数

a、首先创建JNative对象:

JNative jnative = new JNative(dll文件名, 函数名);

b、设置返回值类型:

jnative.setRetVal(Type.INT);

c、设置参数

jnative.setParameter(0, Type.STRING, ); //设置第一个参数为字符串

jnative.setParameter(1, Type.INT, String.valueof());       //设置第二个参数为整数

d、执行

n.invoke();

e、获取返回值

Integer.parseInt(jnative.getRetVal());

3.实例

import org.xvolks.jnative.JNative;

import org.xvolks.jnative.Type;

import org.xvolks.jnative.exceptions.NativeException;

import org.xvolks.jnative.pointers.Pointer;

import org.xvolks.jnative.pointers.memory.HeapMemoryBlock;

public class Test {

       public static void main(String[] args) throws NativeException, IllegalAccessException {

       JNative v=new JNative("Kernel32.dll","GetModuleFileNameA");

        int i = 0;

        v.setRetVal(Type.INT);

        Pointer pName = new Pointer(new HeapMemoryBlock(1024));

       

        v.setParameter(i++, 0);//module handle

        v.setParameter(i++, pName);//pFileName

        v.setParameter(i++, 1024);//nSize

        v.setRetVal(Type.INT);

        v.invoke();

        int ret = Integer.parseInt(v.getRetVal());

        if (ret == 0) {

            // return "null";

            System.err.println(

                    "GetModuleFileName failed!");

        } else {

           

            String path = pName.getAsString().substring(0,

                    ret);

            pName.dispose();

            v.dispose();

            System.out.println("current process's path is:"+path);

        }

    }

 

}

 

 

4.注意:

JNative中用了JDK1.5的一些特性,如枚举、静态引入等,所以在JDK1.4下是不能用的。

.在程序用jawin调用windowdll

jawin 可以对dll中的方法进行调用,也可以调用com中的方法.内部还提供了一个工具,直接对 com组件导出成 java的类,个人认为很方便。

下面是我们作的一个测试,很顺利便通过了。

1、下载jawinhttp://jawinproject.sourceforge.net/

2、配置:

    a.jawin.jar放于%JAVA_HOME%/jre/lib/ext

    b.jawin.dll放于c:/winnt/system32下。否则将出现错误:COMException : no jawin in java.library.path

    也可将jawin.dll放于每个项目目录下。

 

   c.至此在Editplus中调试Jawin/NJawin的例子,可以通过。 而在Eclipse中有时还会出上面的错误:COMException : no jawin in java.library.path

   d.Eclipse中,菜单->window->preference->Java->installed JREs 将原来的remove,重新建一个指到你的java sdk目录。  ok了。

 3、程序测试:

 

import org.jawin.FuncPtr;

 

import org.jawin.ReturnFlags;

 

public class GfJawinTest {

 

       public static void main(String[] args) {

 

              try {

 

                     FuncPtr msgBox = new FuncPtr("USER32.DLL", "MessageBoxW");

                     msgBox.invoke_I(0, "Hello From a DLL", "From Jawin", 0, ReturnFlags.CHECK_NONE);

              } catch (Exception e) {

 

                     e.printStackTrace();

 

              }

 

       }

 

}

 

 

4.利用jawin调用com组件, word:

//创建word

import org.jawin.DispatchPtr;

import org.jawin.win32.Ole32;

public class CreateWord {

 

       public static void main(String[] args) {

              try {

                     Ole32.CoInitialize();//                   初始化

                     DispatchPtr app = new DispatchPtr("Word.Application");//               创建word对象

                     app.put("Visible",true); //                     使word可见

                     DispatchPtr docs=(DispatchPtr)app.get("Documents"); //                 获得document对象集合

                     DispatchPtr doc=(DispatchPtr)docs.invoke("Add");  //                    新增一个文档

                     app.invoke("Activate"); //                    激活当前文档

                    

                     DispatchPtr objTextFont=(DispatchPtr)((DispatchPtr)doc.get("Content")).get("Font");

//                   取得Font对象

                     objTextFont.put("Name","黑体");

//                   设置字体

                     objTextFont.put("Size","48");

//                   设置字号

                     DispatchPtr docSelection=(DispatchPtr)app.get("Selection");

//                   取得Selection对象

                     docSelection.invoke("TypeText","Jawwintesttext!/nJawin测试文本。");

//                   使用TypeText方法添加文本

                     doc.invoke("SaveAs","d://jawintest.doc");

//                   保存文档(保存在C盘根目录下)

                     doc.invoke("Close");

//                   关闭当前文档,去掉前面的注释符并重新编译后可生效

                     app.invoke("Quit");

//                   退出Word,去掉前面的注释符并重新编译后可生效

 

                    

                     Ole32.CoUninitialize(); //                     释放对象

              } catch (Exception e) {

                     e.printStackTrace();

              }

       }

 

}

 

//打开word

import org.jawin.DispatchPtr;

import org.jawin.win32.Ole32;

 

public class OpenWord {

       public static void main(String[] args) {

              try {

                     Ole32.CoInitialize();

                     DispatchPtr app = new DispatchPtr("Word.Application");

                     app.put("Visible", true);

                     DispatchPtr docs = (DispatchPtr) app.get("Documents");

                     DispatchPtr doc = (DispatchPtr) docs.invoke("Open", "d://word.doc");

                     Ole32.CoUninitialize();

              } catch (Exception e) {

                     e.printStackTrace();

              }

       }

}

 

//调用word中的另存为,保存为.html

import org.jawin.DispatchPtr;

import org.jawin.win32.Ole32;

 

public class Word2Html {

       public static void main(String[] args) {

 

              String path = "e://17001939578.doc";

              int iPos = path.lastIndexOf(".");

              String fileExtName = path.substring(iPos + 1);

              String fileMainName = path.substring(0, iPos);

              fileExtName = fileExtName.toLowerCase();

              try {

                     Ole32.CoInitialize();

                     // 初始化

                     DispatchPtr app = new DispatchPtr("Word.Application");

                     // 创建word对象

                     app.put("Visible", false);

                     // 设置word不可见

                     DispatchPtr docs = (DispatchPtr) app.get("Documents");

                     // 取得Documents对象

                     DispatchPtr doc = (DispatchPtr) docs.invoke("Open", path);

                     // 打开指定的word文件

                     doc.invoke("SaveAs", fileMainName + ".html");

                     // 另存为HTML文件

                     app.invoke("quit");

                     // 关闭word

                     Ole32.CoUninitialize();

                     // 释放对象

                     System.out.println("/n转换完成!");

                     System.out.println("/n文件名:" + fileMainName + ".html");

              } catch (Exception e) {

                     System.out.println("/n该文件不存在!或者其他错误(如:运行环境问题)");

              }

       }

}

 

当你在 Java 中尝试调用 `.dll` 文件并遇到“找不到指定程序”的错误时,这通常意味着 Java 程序无法找到或加载所需的本地库。以下是几种常见的原因及解决办法: ### 可能的原因 1. **DLL路径未正确配置** - 如果 DLL 文件不在系统的默认搜索路径中(如 `PATH` 环境变量),Java 将无法找到它。 2. **依赖项缺失** - 某些 DLL 文件可能会依赖于其他动态链接库 (DLL),如果缺少这些依赖项,则会抛出此异常。 3. **位数不匹配** - 运行的应用程序和目标 DLL 的架构需要一致。例如,64 位应用程序只能加载 64 位的 DLL;反之亦然。 4. **JNI 接口问题** - 当通过 JNI 调用本机方法时,函数名、参数等是否严格按照规定编写。 5. **权限不足** - Windows 上可能存在权限限制导致不能访问某些系统目录下的 dll 文件。 ### 解决方案 #### 添加到 PATH 或直接指明全路径 将包含所需 .dll文件夹添加至系统的 `PATH` 环境变量,或者是在加载 Library 时提供绝对路径: ```java System.load("C:\\full\\path\\to\\yourlibrary.dll"); ``` #### 使用 System.loadLibrary() 对于大多数情况而言更推荐的方式是利用 `System.loadLibrary()` 函数,在这里你需要传递一个简短形式的名字而不是完整路径,并确保该名称已按照平台约定进行了正确的命名转换(Windows 下通常是去掉前缀 lib 和后缀.so/.dylib)。 ```java static { try{ // 假设我们的 dll 名叫 mylib.dll System.loadLibrary("mylib"); } catch(UnsatisfiedLinkError e){ System.out.println("Native code library failed to load.\n" + e); } } ``` 另外还要保证这个 dll 所处的位置位于 JVM 查找 native libraries 默认位置之一里边,比如可以放在项目的根目录下然后设置 `-Djava.library.path`. #### 验证依赖完整性 借助工具像 [Dependency Walker](http://www.dependencywalker.com/) 来检查你的 DLL 是否有所有必要的依存关系以及它们是否存在并且可用. #### 架构一致性确认 运行命令提示符以管理员身份打开CMD窗口输入 "wmic os get osarchitecture" 查询当前操作系统体系结构信息;同时也要查看自己的项目是以哪种模式编译出来的(JDK x86/x64),从而下载对应版本类型的第三方库资源. 如果你已经完成了上述步骤仍然存在问题的话,请进一步排查是否有防火墙或者其他安全软件阻止了对 DLL 的读取操作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值