java如何调用dll文件

NOKIA5320XM 2009-11-15 05:01:31
我用java怎么去调用c#的dll文件,请给个小实例!
...全文
14309 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
牛叔 2009-12-24
  • 打赏
  • 举报
回复
我也正为这个问题困惑
很烦躁啊
NOKIA5320XM 2009-11-17
  • 打赏
  • 举报
回复
通过Web Services实现.net 与 java的互通,感觉还是这样简单!
liyingchao524 2009-11-16
  • 打赏
  • 举报
回复
java 调用dll库,你必须要依次进行以下几个步骤:
1.你必须在你的Java类中定义一个声明为native的方法。
2.用javac命令编译你刚写好的这个类。
3.使用javah java类名(你那个类的名字) 会生成扩展名为.h的头文件。
4.把这个.h的文件导入到你所使用c/c++的开发工具。
5.使用C/C++实现本地方法,也就是你定义的那个native方法。(这时候你需要看jni的API,因为语言之间对数据类型的定义是不一样的,特别是Java中的String 类型。你要把它转换成C/C++所能认识的数据类型,必须用JNI提供的一下方法,恩,和麻烦)。
6.将C/C++编写的文件生成dll动态连接库.
7.在Java中用System.loadLibrary("动态链接库名");加载动态库.dll文件放在在当前的路径上。
不过强烈建议,不要用这种方法。太痛苦了。不但要转化变量类型,且中文字符的处理更麻烦(当时时间比较紧,老师催,我最终也没能让他支持中文)。最痛苦的是,程序出问题很难调试。你根本不知道那边错了,是Java这边在调这个方法前出错了,还是c/c++在实现过程中错了。因为c/c++虽然可以实现这个方法,但它本事不能调用这个方法,也就是它不能测试这个方法是不是对的。而Java虽然可以调用,又不是它实现的,没法追踪找错。
呵呵,我是新手,今天刚注册个号,就碰见一个我知道一点的东西。若答到不好。请见谅。共同学习。
Sunny_kaka 2009-11-16
  • 打赏
  • 举报
回复
顶25楼
bawgiitx 2009-11-16
  • 打赏
  • 举报
回复
JNative,试试
以前写QQ美女找茬自动找就是用jni,vc6.0+netbeans
qfangmiao 2009-11-16
  • 打赏
  • 举报
回复
jni这个东西比较复杂 因为前几天自己刚好做过这个么东西 所以才推荐你用JNative的哦(我也是刚接触这个是个菜鸟).....
看楼主这么执着那我就写个小例子 大家不要见笑(- -!)
假设现在有个A.dll里面有个方法叫做int add(int a, int b)现在就是要用jni去调用它
这里附上A.dll里面的代码(自己瞎个的吧 能用就行)
 #include "stdafx.h"

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}

extern "C"
int _declspec(dllexport) add(int a ,int b)
{
return a+b;
}


接下来我们的思路自己写个B.dll然后在这个dll里面去调用A.dll里面的这个add方法,然后通过JAVA去调用自己的这个B.DLL....
第一步: 随便建个txt文件 呵呵 当然后缀改上.JAVA写上

public class DemoJni{
public native int getNumber(int a,int b);
public static void main(String[] args) {
}
}


然后javac一下 没错的话 javah 生成了DemoJni.h(如下)
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class DemoJni */

#ifndef _Included_DemoJni
#define _Included_DemoJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: DemoJni
* Method: getNumber
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_DemoJni_getNumber
(JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus
}
#endif
#endif


用VC++6.0写B.DLL
新建DLL工程名字为B 在Header FILES->添加这个DemoJni.h
然后就写B.cpp
// B.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "jni.h"
#include "DemoJni.h"

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}

JNIEXPORT jint JNICALL Java_DemoJni_getNumber
(JNIEnv * env, jobject o, jint x, jint y)
{
typedef int (*ADD)(int ,int);//函数指针类型
HINSTANCE Hint = ::LoadLibrary("A.dll");//加载我们刚才生成的dll
ADD add = (ADD)GetProcAddress(Hint,"add");//取得dll导出的add方法
return add(x,y);

FreeLibrary(Hint);
}

对了在VC++6.0要引入java的一些包 因为我们上面引入了#include "jni.h"
具体做法 工具->选项->目录->新建两个路径 :比如C:\PROGRAM FILES\JAVA\JDK1.5.0_14\INCLUDE
和C:\PROGRAM FILES\JAVA\JDK1.5.0_14\INCLUDE\WIN32
搞定后就可以编译了 然后在debug文件下面就生成了我们要的B.DLL
然后A.DLL和B.DLL以及.java文件放一起咯
下面就是调用 改写我们的.java文件如下
public class DemoJni{
public native int getNumber(int a,int b);
public static void main(String[] args) {

System.loadLibrary("B");
DemoJni p=new DemoJni();
System.out.println(p.getNumber(1, 100));

}
}


然后java 一下 然后输出
101
然后OK!

这个东西如果用JNative来做的话 实在是太简单了- -!附上JNative的代码

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

public class test {
static JNative myjnative = null;

public int getnumber(int a, int b) throws NativeException,
IllegalAccessException {

try {
if (myjnative == null) {

myjnative = new JNative("A.dll", "add");
myjnative.setRetVal(Type.INT);
}
int i = 0;
myjnative.setParameter(i++, a);
myjnative.setParameter(i++, b);

myjnative.invoke();
return myjnative.getRetValAsInt();
} finally {
if (myjnative != null) {
myjnative.dispose();
}
}
}

public static void main(String[] args) throws NativeException,
IllegalAccessException {
test uc = new test();
int result = uc.getnumber(1,100);

System.err.println("result:" + result);
}
}


Jnative我觉得有个很好的地方就是有POINTER 指针这个东西.....
睡觉.......
YH555 2009-11-16
  • 打赏
  • 举报
回复
通过websevice 可以咯
你写一个服务端,里面有导入dll文件,并根据文件生成生成相应的资源
再写个客户端就可以调用其里面的资源1
closewbq 2009-11-16
  • 打赏
  • 举报
回复
想要调用c#dll的方法比较麻烦,Java->C++库->Managed C++库->C#库。如果你需要调用c#的东西不是很复杂的话,你完全可以用java实现。
道光2008 2009-11-16
  • 打赏
  • 举报
回复
public class helloWorld
{
public native void SayHello(String name);

static
{
System.loadLibrary("examdll");
}

public static void main(String [] argv)
{
helloWorld hello = new helloWorld();
hello.SayHello("myName");
}
}
NOKIA5320XM 2009-11-16
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 dreambegin 的回复:]
JNI , 就是专门用于调用其他语言的 。。。感觉有些问题还得自己去找资料,别人只用给你说思路就行了。。。。。等的时间,自己估计也找到了。。。。
[/Quote]
现在问题是没什么思路!
NOKIA5320XM 2009-11-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 nokia5320xm 的回复:]
如何通过JNI调用VC写的DLL?


看了网上的一些例子,但是总是调用不成功。
看了一下大体的步骤是:
编写JAVA类,声明原生接口---》编译成CLASS文件---》编译生成 .h 头文件---》将 .h 头文件加入C/VC的工程中,编译生成DLL---》编写JAVA程序去调用DLL。

但是,我们现在所使用的DLL都是其他公司提供给我们的,预先生成好了,我们没有源代码,无法修改,那么我们是不是必须要根据我们生成的 .h 头文件,重新编译生成DLL呢??

还请各位大侠指点,该怎么做啊。急啊。
[/Quote]
自己顶下,哎
junkor 2009-11-16
  • 打赏
  • 举报
回复
JNI , 就是专门用于调用其他语言的 。。。感觉有些问题还得自己去找资料,别人只用给你说思路就行了。。。。。等的时间,自己估计也找到了。。。。
阿士匹灵 2009-11-16
  • 打赏
  • 举报
回复
学习
lzh_me 2009-11-16
  • 打赏
  • 举报
回复
学习...
coolbamboo2008 2009-11-16
  • 打赏
  • 举报
回复
共同学习,楼上精神可嘉
NOKIA5320XM 2009-11-16
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 closewbq 的回复:]
想要调用c#dll的方法比较麻烦,Java->C++库->Managed C++库->C#库。如果你需要调用c#的东西不是很复杂的话,你完全可以用java实现。

[/Quote]
c#的东西很复杂
shaoxx 2009-11-16
  • 打赏
  • 举报
回复
用过JACOB,使用很简单的

ActiveXComponent cccX = new ActiveXComponent(ControlName);

cccX.setProperty()
cccX.getProperty()
等方法可以操作属性

Dispatch dptch = cccX.getObject();
Variant Ret = Dispatch.call(dptch, methodName);
就可以调用方法了
阁楼上的伟哥 2009-11-15
  • 打赏
  • 举报
回复
我见过 C# C++ 等windows 编程 没见过java引用dll的。
学习
GG_wg 2009-11-15
  • 打赏
  • 举报
回复

在你调用的Java类里添加你需要调用的方法,
如:int Init(const char * Data1,char * retMsg,char* Data2)
类里:public native int init(const String Data1,String retMsg,String Data2);

NOKIA5320XM 2009-11-15
  • 打赏
  • 举报
回复
在加一百分,等回帖
加载更多回复(9)

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧