登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 程序员学前班[不再更新,只读] >> 主题: jacob 巧用C#做中间语言 实现Java调用.net DLL     [回主站]     [分站链接]
标题
jacob 巧用C#做中间语言 实现Java调用.net DLL
clq
浏览(0) + 2010-07-28 14:41:35 发表 编辑

关键字:

来自  http://www.chinaz.com/Program/.NET/062211OC2010.html

clq
2010-7-28 14:42:01 发表 编辑

本文将详细为大家介绍一个java调用.net DLL的方法,以实现特殊的客户的特殊要求:“在Java项目中必须使用其提供的用.net写的DLL加密机制!”

环境与工具:

◆.net framework 3.5 C#

◆java jdk1.5, Tomcat 5.5

◆jacob-1.15-M3

实现例子:

一、C# 制作Com组件

新建一个Class 项目,取名TestCom

代码

using System;  using System.Collections.Generic; 
using System.Linq;  using System.Text; 
using System.Runtime.InteropServices;  
namespace TestCom 
{      [Guid("E9BCF867-CD81-40d0-9591-ED28D1ED2B53")]     
public interface IEncrypt     
{          [DispId(1)]          
string GetEncrypt(string str,string str2);     
}     
[Guid("33A6E58D-E1F5-4b53-B2E2-03B9F8BA2FAD"),
ClassInterface(ClassInterfaceType.None)]     
public class Encrypt:IEncrypt     
{          public Encrypt(){}          
public string GetEncrypt(string str,string str2)         
{                           
return  "测试 | "+str+"|"+str2;         
}     

}

打开 Project--> Properties菜单 在Application标签中打开 Assembly Information 将Make assembly Com-Visible一项选中。再切换到Build标签将 Register for COM interop一项选中。

Guid的生成:打开Visual Studio Command Prompt 输入guidgen 命令调出工具。类型选择Registry Format,点击New Guid,然后COPY出来。

[DispId(1)]为函数的标识。如果有多个函数可相应的在函数前面加[DispId(2)], [DispId(3)]…

编译程序Debug目录中会生成 TestCom.dll 和TestCom.tlb

手工注册Com方法:

打开Visual Studio Command Prompt进入Debug目录,运行命令注册:regasm TestCom.DLL /tlb:TestCom.tlb

二、Java调用Com

部署jacob

◆在开发环境中引入jacob.jar

◆拷贝jacob-1.15-M3-x86.dll 文件到 C:\Windows\System32目录,如果是Web应用的话还需要拷贝到jdk1.5.0_16\bin目录(jdk安装目录下的bin目录)

java调用代码

代码

import com.jacob.activeX.ActiveXComponent; 
import com.jacob.com.ComThread; 
import com.jacob.com.Dispatch; 
import com.jacob.com.Variant; 
public class test
{      
/**       * @param args       */     
public static void main(String[] args)
{         
// TODO Auto-generated method stub         
try
{             
ActiveXComponent dotnetCom = null;             
dotnetCom = new ActiveXComponent("TestCom.Encrypt");             
Variant var = Dispatch.call(dotnetCom,
"GetEncrypt","哥是第一个参数","哥是第二个参数");             
String str  = var.toString(); //返回值             
} catch (Exception ex)
{                 
ex.printStackTrace();             
}     
}  
}

这便完成了Java调用.net DLL的方法!


clq
2010-7-28 14:50:55 发表 编辑

java调用dll的几种方法(JNI,Jawin,Jacob)

http://hi.baidu.com/dobodo/blog/item/112631119188b07acb80c410.html

       前些天做单点登录,需要java调用dll,现在把成功经验与大家分享。
   使用Java调用DLL动态链接库的方案通常有三种:JNI, Jawin, Jacob. 其中JNI(Java Native

Interface)是Java语言本身提供的调用本地已编译的函数库的方法,本身具有跨平台性,可以在不同的

机器上调用不同的本地库。Jawin和Jacob都是sourceforge.net的开源项目,都是基于JNI技术的依赖Wi

ndows的实现,使得在Windows平台下使用COM和DLL的更加方便。

一、JNI(Java本地方法调用)
    JNI的应用方案是基于Java类和本地函数相映射的。其使用DLL的步骤还是相对比较麻烦,不但涉及

到Java编程,还涉及到C/C++编程。

    JNI的使用步骤是:

1. 编写Java类,用该类将DLL对外提供的函数服务进行声明,其中的Java方法均声明为native,其方法

签名可以自定义,不用实现函数体。

2. 用Javah工具将该Java类生成对应的.h头文件。

3.  

最重要的比较麻烦的一步:编写C/C++代码实现.h头文件中声明的函数,该C/C++代码中包含jni.h头文

件,并且编写代码时使用其中定义好的数据类型作为函数的输入和返回数据类型进行编程。用这种方法

实现数据类型转换。在该步骤中,可以在C/C++代码中调用已经存在的DLL库(当别人给我们提供一个现

成的dll控件时,我们只知道接口,不能改变它的实现,就需要“自定义的dll”调用“现成dll”)

4. 另外编写的Java代码时就可以使用该Java类了。

在第3步中,编写C/C++函数时,可以使用一个叫interface pointer的env指针来调用JNI提供的一系列(

很多)函数,用这些函数来访问JVM的对象和数据。

使用JNI的缺点:使用比较麻烦,需要对已有的DLL进行封装,需要对C/C++比较了解。

使用JNI的优点:可以跨平台调用本地库。

二、Jawin

官方网站:http://jawinproject.sourceforge.net/


Jawin的应用方案是基于函数调用时采用原始字节流传递数据的。就是在Java中指明一个DLL中的某个函

数后,通过原始字节流(需要考虑参数数据类型所占的存储字节数及系统使用的字节序列)传递给该DLL

函数需要的参数,其返回值也是通过原始字节流解析的方式获得正确的值。

Jawin有一个Jawin.dll和Jawin.jar,根据开发环境不同,需要不同的配置.


使用Jawin的缺点:不方便调试,几乎所有的错误都抛出同样的异常COMException;需要对数据类型的

转换比较了解;不能跨平台,对Windows的依赖性比较强。

使用Jawin的优点:方便使用,不用进行C/C++开发,不用对原始DLL进行封装就可以方便使用。

本人体会:我在用 Jawin 调用单点的dll时,多次出现错误,最终调试失败,后来查看它的官方文档,

发现它对某些com调用不支持。

三、Jacob

官方文档:http://danadler.com/jacob/

Jacob是Java-Com Bridge的缩写,也可以用来调用DLL。其底层也是使用JNI实现,也具有Windows 的平

台依赖性。

该控件调用相当方便,可以调用com和active, 几分钟就可以搞定,它下载后有一个dll和一个jar包,

把dll放到WIN_HOME/system32/下既可,把jar包放到工程的classpath下。

下面是我调用单点dll的事例:

import com.jacob.com.*;


public class CallSSO {
    private static Dispatch dif;
    //加载单点控件SSOCrypto.SSOCrypt.1
    static {
         dif = new Dispatch("SSOCrypto.SSOCrypt.1");
    }
    //产生随机码,调用单点的接口SSORadomGen,传递参数是strPlainString
    public static int SSORadomGen(String strPlainString)
    {
          Variant radom = Dispatch.call(dif, "SSORadomGen", new Variant(strPlainString));
          return radom.getInt();
    }
//取的加密串,调用单点的接口SSOEncrypt,传递参数是strPlainString,lngRandomnum,strSvrCert
    public static String SSOEncrypt(String strPlainString,
                                           int lngRandomnum)
    {
        String strSvrCert ="1BQYR-YLGXV-QM439-CJSCS-TCN6V";
        Variant encrypt = Dispatch.call(dif, "SSOEncrypt", new

Variant(strPlainString),new Variant(lngRandomnum),new Variant(strSvrCert));
        return encrypt.getString();
    }
}
缺点:不能跨平台,对Windows的依赖性比较强。

优点:调用相当方便,不用进行C/C++开发,不用对原始DLL进行封装就可以方便使用。

总结:以上三种方法是现在常用的java调用dll方法,本人感觉第三种比较好用,当然,每种都有优缺点,还有性能问题,我没有测试比较,请大家自己试一下吧。




总数:2 页次:1/1 首页 尾页  
总数:2 页次:1/1 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1