Robin's Blog

记录 积累 学习 成长

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
谁说jni搞不定事件通知了?搞不定你列得这几个方案怎么实现的?SWT怎么实现的?只是你不会用罢了。
2 楼 liangwj72 2007-09-13   引用
如果要用java调com,不要用jni,因为jni搞不定com的事件通知 

选择一:商业用途建议用J-Integra for COM。 
优点:稳定,使用简单 
缺点:只有商业版,收费的,贵死。 
取巧的办法:weblogic中带了这套工具,听说weblogic很多盗版的.... 

例如以一个com中有add(int,int)的方法,并有一个事件通知。样例代码如下: 
Java代码 
  1. public class ConnectPointComTest {  
  2.     static {  
  3.         System.setProperty("JINTEGRA_NATIVE_MODE""");  
  4.         System.setProperty("JINTEGRA_COINIT_VALUE""2");  
  5.     }  
  6.   
  7.     public void run() {  
  8.         try {  
  9.             _IDispConnectEventsAdapter evt=new _IDispConnectEventsAdapter();  
  10.             final DispConnect dcon = new DispConnect();  
  11.             dcon.add_IDispConnectEventsListener(evt);  
  12.             dcon.add(145);  
  13.         } catch (IOException e) {  
  14.             e.printStackTrace();  
  15.         }  
  16.     }  
  17. }  

dispConn开头的类用J-Integra for COM提供的工具生成的。 
使用起来就象使用普通的java类一样的简单。 

选择二: JACOB - Java COM Bridge 
优点:开源,免费的,效果高 
缺点:超过10个并发就死翘翘了,代码不好看。 

同样是上面的那个com,样例代码: 
Java代码 
  1. public void run() {  
  2.     Dispatch test = new Dispatch("MyCOM.Test");  
  3.     MyCOMEvent myCOMEvent = new MyCOMEvent();  
  4.     DispatchEvents de = new DispatchEvents(test, myCOMEvent);  
  5.      Dispatch.call(test, "Add",90,68);  
  6.     Variant ret = Dispatch.call(test, "Sum"36);  
  7.   
  8.     de.safeRelease();  
  9.     test.safeRelease();  
  10. }  

可以看到jacob的调用方式,类似与我们通过反射方式获得实例的方法,然后在调用方法的过程。麻烦啊 

选择三:Jacozoom 
优点:使用方法和J-Integra for COM类似,一样的简单 
缺点:和jacob一样的不稳定,仅仅是稍微好点,并发超过20个才崩溃,收费的。 
样例代码懒得写了。 

评价 
没事就不要用java调com,再简单的代码也简单不错用c#调com,而且效率很有问题,调用10万次后计算出平均每次调用时间为1.7毫秒,这个效率实在太低了。
posted on 2010-04-19 14:42  Robin99  阅读(12046)  评论(0编辑  收藏  举报