Java怎么调用.net DLL

Python08

Java怎么调用.net DLL,第1张

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++程序调用来生成所需的库文件。

C# 的程序是 dll?还是 exe文件?

dll是不能直接执行的,如果是exe, 可以用 Runtime.getRuntime().exec("exe文件路径")执行。

一. 使用axis1.x调用webservice方法

Axis的最常用版本:1.4和2.0版本。以下为1.4版本

 核心代码:

// webserviceURL

service_url = "http://vip.cxcod.com/PodApi/GetPodStr.asmx?wsdl"

Service service = new Service()

Call call = (Call) service.createCall()

call.setTargetEndpointAddress(new java.net.URL(service_url))

// 设置要调用的方法

// http://intelink.net/是wsdl中definitions根节点的targetNamespace属性值

call.setOperationName(new QName("http://intelink.net/","GetStrByJobno"))

// 该方法需要的参数

call.addParameter("CustNo",

org.apache.axis.encoding.XMLType.XSD_STRING,

javax.xml.rpc.ParameterMode.IN)

call.addParameter("passwd",

 org.apache.axis.encoding.XMLType.XSD_STRING,

 javax.xml.rpc.ParameterMode.IN)

call.addParameter("Jobno",

 org.apache.axis.encoding.XMLType.XSD_STRING,

 javax.xml.rpc.ParameterMode.IN)

// 方法的返回值类型

call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING)

// call.setUseSOAPAction(true)//call.setSOAPActionURI("http://intelink.net/GetStrByJobno")

// 调用该方法, new Object[] { CustNo, passwd, Jobno}为参数列表

String xmlStr = call.invoke(new Object[] { CustNo, passwd, Jobno}).toString()

} catch (Exception e) {

e.printStackTrace()

}

JAVA用这种方式调用webservice,需要注意的地方:

1. 服务器未能识别 HTTP 标头 SOAPAction 的值:

症状一:

Web Service + ASP.NET 应用程序部署到服务器默认目录中,在IE中用http://<服务器地址>/<程序目录名>/<默认启动页面名>发生“服务器未能识别 HTTP 标头 SOAPAction 的值”错误。

症状二:

在Java平台上调用.NET Web Service的服务时,出现"服务器未能识别 HTTP 标头 SOAPAction 的值"。

症状三:

在Java平台下调用.NET WEB Service,出现数据时有时无。

解决对策:

给.NET的WebService类(即.asmx文件下的类)添加属性[SoapDocumentService(RoutingStyle=SoapServiceRoutingStyle.RequestElement)]

小知识:

什么是SoapAction?它在WSDL中有何作用?

SOAPAction HTTP request header被用来标识SOAP HTTP请求的目的地,其值是个URI地址。SOAP发送并不限制格式、URI特征或其必须可解析,那么在这种情况下,发送一个HTTP SOAP请求时,其HTTP客户端必须使用/指明SOAPAction HTTP request header。

SOAPAction header的内容可以被用在服务端,诸如:防火墙适当的过滤基于HTTP的SOAP请求消息等场景。SOAPAction header的值为空串("")表示SOAP消息的目的地由HTTP请求的URI标识;无值则表示没有指定这条消息的目的地。

本人补充:

在.NET环境调用.NET WebService出现 “SOAPAction 值在 XML Web services 的所有方法中不唯一的错误”,也可以通过此法解决。

2. 为了Java能够调用WebService的方法,所以。NETP写的WebServiced的每个方法都要声明为Rpc方法,即添加"[SoapRpcMethod.....]".

例如:[WebMethod]

[SoapRpcMethod(Use=SoapBindingUse.Literal,Action= http://tempuri.org/HelloWorld", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/")]

3. 对返回值、参数的处理上:

应尽量将webservice方法的返回值、参数都写成字符串(String)不要使用复杂对象类型,这样便于在网络上传输。避免了复杂对象类型的不易转换问题。。。对于返回类型是字符串数组型的,可以设置返回类型为org.apache.axis.encoding.XMLType.SOAP_VECTOR或java.lang.String[].class.

二.利用xfire调用WebService

XFire是新一代的Java Web服务引擎,XFire使得在JavaEE应用中发布Web服务变得轻而易举。和其他Web服务引擎相比,XFire的配置非常简单,可以非常容易地和Spring集成,它使得Java开发人员终于可以获得和.Net开发人员一样的开发效率。

核心代码:

Service service = new ObjectServiceFactory().create(IWebservice.class)

XFireProxyFactory factory =

new XFireProxyFactory(XFireFactory.newInstance().getXFire())

String url= "http://localhost:8080/webservices/services/webservices"

IWebservice iw = (IWebservice) factory.create(service, url)

List list=iw.getTest()

出处:http://liyuandong.iteye.com/blog/567836