java如何调用别人给的DLL文件
现在有一个DLL,是别人已经给好的,并且给出了函数的文档,现在我要用java来实现设个功能,如何调用别人给出的函数呢?最好给个例子。...
现在有一个DLL,是别人已经给好的,并且给出了函数的文档,现在我要用java来实现设个功能,如何调用别人给出的函数呢?最好给个例子。
展开
3个回答
2016-01-01 · 知道合伙人互联网行家
关注
展开全部
JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。
简单介绍及应用如下:
一、JAVA中所需要做的工作
在JAVA程序中,首先需要在类中声明所调用的库名称,如下:
static {
System.loadLibrary(“goodluck”);
}
在这里,库的扩展名字可以不用写出来,究竟是DLL还是SO,由系统自己判断。
还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具 体实现。如下:
public native static void set(int i);
public native static int get();
然后编译该JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就会生成C/C++的头文件。
例如程序testdll.java,内容为:
public class testdll
{
static
{
System.loadLibrary("goodluck");
}
public native static int get();
public native static void set(int i);
public static void main(String[] args)
{
testdll test = new testdll();
test.set(10);
System.out.println(test.get());
}
}
用javac testdll.java编译它,会生成testdll.class。
再用javah testdll,则会在当前目录下生成testdll.h文件,这个文件需要被C/C++程序调用来生成所需的库文件。
简单介绍及应用如下:
一、JAVA中所需要做的工作
在JAVA程序中,首先需要在类中声明所调用的库名称,如下:
static {
System.loadLibrary(“goodluck”);
}
在这里,库的扩展名字可以不用写出来,究竟是DLL还是SO,由系统自己判断。
还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具 体实现。如下:
public native static void set(int i);
public native static int get();
然后编译该JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就会生成C/C++的头文件。
例如程序testdll.java,内容为:
public class testdll
{
static
{
System.loadLibrary("goodluck");
}
public native static int get();
public native static void set(int i);
public static void main(String[] args)
{
testdll test = new testdll();
test.set(10);
System.out.println(test.get());
}
}
用javac testdll.java编译它,会生成testdll.class。
再用javah testdll,则会在当前目录下生成testdll.h文件,这个文件需要被C/C++程序调用来生成所需的库文件。
展开全部
请参考 JNative 手册, 网上有. 这是调用标准C/C++动态库的最简单的方案.
调用步骤:
加载 dll 中的方法:
JNative f_xxx= new JNative("dll文件", "方法名称", Convention.STDCALL);
f_xxx.setRetVal(Type.INT); //设置返回值
调用:
f_xxx.setParameter(0, 参数1);
...
获取返回值
f_xxx.getRetValAsInt() 或其他...
更多追问追答
追问
你中间的调用环节只是设置参数啊,那怎么实际调用他的方法呢,我现在这样写,他返回的是null,理论上应该有值啊
还有,这个参数是干什么用的Convention.STDCALL
追答
调用部分貌似被我编辑掉了, 应该这样调用:
f_xxx.invoke();
返回的是空, 你需要检查入参类型是否匹配, 这个要仔细核对. 返回类型如果没有值, 也要设定为 Type.VOID
Convertion.STDCALL 是标记 dll中的这个函数声明的是 __stdcall 模式调用. 还有 __cdecl, __fastcall 其他2种类型, 通常都是 __stdcall
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
JNI JNative 或者jacob都行 最理想的是用JNI 不过是用JNI比较麻烦,可能需要用C写数据类型转换的函数,但是能保证正确的调用Dll中的函数。Jacob和JNative也都不错,使用比较方法,但是可能无法成功的调用DLL的函数。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询