谁说jni搞不定事件通知了?搞不定你列得这几个方案怎么实现的?SWT怎么实现的?只是你不会用罢了。
如果要用java调com,不要用jni,因为jni搞不定com的事件通知
选择一:商业用途建议用J-Integra for COM。
优点:稳定,使用简单
缺点:只有商业版,收费的,贵死。
取巧的办法:weblogic中带了这套工具,听说weblogic很多盗版的....
例如以一个com中有add(int,int)的方法,并有一个事件通知。样例代码如下:
dispConn开头的类用J-Integra for COM提供的工具生成的。
使用起来就象使用普通的java类一样的简单。
选择二: JACOB - Java COM Bridge
优点:开源,免费的,效果高
缺点:超过10个并发就死翘翘了,代码不好看。
同样是上面的那个com,样例代码:
可以看到jacob的调用方式,类似与我们通过反射方式获得实例的方法,然后在调用方法的过程。麻烦啊
选择三:Jacozoom
优点:使用方法和J-Integra for COM类似,一样的简单
缺点:和jacob一样的不稳定,仅仅是稍微好点,并发超过20个才崩溃,收费的。
样例代码懒得写了。
评价
没事就不要用java调com,再简单的代码也简单不错用c#调com,而且效率很有问题,调用10万次后计算出平均每次调用时间为1.7毫秒,这个效率实在太低了。
选择一:商业用途建议用J-Integra for COM。
优点:稳定,使用简单
缺点:只有商业版,收费的,贵死。
取巧的办法:weblogic中带了这套工具,听说weblogic很多盗版的....
例如以一个com中有add(int,int)的方法,并有一个事件通知。样例代码如下:
- public class ConnectPointComTest {
- static {
- System.setProperty("JINTEGRA_NATIVE_MODE", "");
- System.setProperty("JINTEGRA_COINIT_VALUE", "2");
- }
- public void run() {
- try {
- _IDispConnectEventsAdapter evt=new _IDispConnectEventsAdapter();
- final DispConnect dcon = new DispConnect();
- dcon.add_IDispConnectEventsListener(evt);
- dcon.add(14, 5);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
dispConn开头的类用J-Integra for COM提供的工具生成的。
使用起来就象使用普通的java类一样的简单。
选择二: JACOB - Java COM Bridge
优点:开源,免费的,效果高
缺点:超过10个并发就死翘翘了,代码不好看。
同样是上面的那个com,样例代码:
- public void run() {
- Dispatch test = new Dispatch("MyCOM.Test");
- MyCOMEvent myCOMEvent = new MyCOMEvent();
- DispatchEvents de = new DispatchEvents(test, myCOMEvent);
- Dispatch.call(test, "Add",90,68);
- Variant ret = Dispatch.call(test, "Sum", 3, 6);
- de.safeRelease();
- test.safeRelease();
- }
可以看到jacob的调用方式,类似与我们通过反射方式获得实例的方法,然后在调用方法的过程。麻烦啊
选择三:Jacozoom
优点:使用方法和J-Integra for COM类似,一样的简单
缺点:和jacob一样的不稳定,仅仅是稍微好点,并发超过20个才崩溃,收费的。
样例代码懒得写了。
评价
没事就不要用java调com,再简单的代码也简单不错用c#调com,而且效率很有问题,调用10万次后计算出平均每次调用时间为1.7毫秒,这个效率实在太低了。