jnative调用delphi的DLL文件

来源:互联网 发布:windows安装包制作工具 编辑:程序博客网 时间:2024/06/06 01:13

1.下载JNative的包

JNative-1.3.2下有三个文件:JNativeCpp.dll,libJNativeCpp.so,JNative.jar。

JNativeCpp.dll拷到windows/system32目录下

libJNativeCpp.so为Linux中使用的文件

JNative.jar扩展包拷到%JAVA_HOME%/jre/lib/ext下或者导入到工程中


2.Jnative中使用到的一些类和方法

org.xvolks.jnative.Jnative:  装载dll文件,定位函数  如:Jnative native=new Jnative("dllName");
JNative(),setParameter(),setRetVal(),getRetVal() etc.

org.xvolks.jnative.pointers.Pointer: 替代本地函数中的的指针,需要先申请一块内存空间,才能创建,一般使用MemoryBlockFactory利用工厂模式进行创建.
Pointer(),dispose()

org.xvolks.jnative.pointers.memory.MemoryBlockFactory : 申请一块内存空间
createMemoryBlock()

org.xvolks.jnative.exceptions.NativeException: 抛出装载,定位等方面的异常

org.xvolks.jnative.Type: 列举和管理Jnative需要的不同的数据类,一般需要传值的时候指定所传值的类型和函数的返回值


3.使用方法

3.1. 加载dll文件

JNative可使用两种方式加载dll文件:
使用System.loadLibrary加载
使用此方法可加载系统目录中的dll文件。可以先把dll文件复制到system32目录下,使用文件前缀名作为参数来加载dll文件。
使用System.load加载
此方法参数为dll文件全路径名。

3.2. 调用函数

1、首先创建JNative对象:
JNative jnative = new JNative(dll文件名, 函数名);
2、设置返回值类型:
jnative.setRetVal(Type.INT);
3、设置参数
jnative.setParameter(0, Type.STRING, …); //设置第一个参数为字符串
jnative.setParameter(1, Type.INT, String.valueof(…));       //设置第二个参数为整数
4、执行
n.invoke();
5、获取返回值
Integer.parseInt(jnative.getRetVal());


4.一个简单的例子:

import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;

public class JNativeTest {
    public static final int messageBox(int parentHandle, String message,
             String caption, int buttons) throws NativeException,
             IllegalAccessException {
          JNative n = null;
          try {
             n = new JNative("User32.dll", "MessageBoxA"); // 常量DLL_NAME的值为User32.dll
             // 构造JNative时完成装载User32.dll,并且定位MessageBoxA方法
             n.setRetVal(Type.INT); // 指定返回参数的类型
             int i = 0;
             n.setParameter(i++, Type.INT, "" + parentHandle);
             n.setParameter(i++, Type.STRING, message);
             n.setParameter(i++, Type.STRING, caption);
             n.setParameter(i++, Type.INT, "" + buttons); // 指定位置上的参数类型和值
             n.invoke(); // 调用方法
             return Integer.parseInt(n.getRetVal());
          } finally {
             if (n != null)
                n.dispose(); // 记得释放
          }
       }
    public static void main(String[] args) throws NativeException, IllegalAccessException{
        JNativeTest.messageBox(100,"Hello jnative", "jnativetest", 1);
    }
}

原创粉丝点击