JAVA与.NET的相互调用——利用JNBridge桥接模式实现远程通讯

.NET服务端开发

假如阁下使用的是Visual Studio 2008或者Visual Studio 2010版本,系统将会感知JNBridge的存在,在新建项目时,可以直接新建一个DotNetJavaProxies项目。在此在下想展示一下JNBridge的转换性能,所以直接新一个解决方案。添加一个Model项目,加入Person类,为Person加入Serializable特性,注意要去除不必要的引用,因为对Framework的引用在转换时将变为对应的包。

using System;

namespace Model
{
[Serializable]
public class Person
{
public int ID
{
get;
set;
}

    public string Name
    {
        get;
        set;
    }

    public int Age
    {
        set;
        get;
    }
}

}
  添加一个Manager项目,加入PersonManager类,在测试时,只是把虚拟数据放在DataSource.sour文件中。

using System;
using Model;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Collections.Generic;

namespace Manager
{
public class PersonManager
{
/// 虚拟数据源
private List DataSource()
{
FileStream fileStream = new FileStream("./DataSource.sour", FileMode.Open, FileAccess.ReadWrite);
BinaryFormatter formatter = new BinaryFormatter();
List personList=(List)formatter.Deserialize((fileStream));

        return personList;
    }

    //获取所有的Person
    public List<Person> GetList()
    {
        List<Person> personList = DataSource();
        return personList;
    }

    //根据输入ID获取对应的Person
    public Person GetPersonByID(int id)
    {
        foreach (Person person in DataSource())
        {
            if (person.ID == id)
                return person;
        }
        return null;
    }
}

}
  添加一个ConsoleApplication作为启动项目,在项目中添加对JNBShare.dll的引用(文件路径 “\JNBridge\JNBridgePro v5.1\4.0-targeted”),然后添加配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<!-- 注册共用程序集 -->
<assemblyList>
  <assembly file=".\Model.dll"/>
  <assembly file=".\Manager.dll"/>
</assemblyList>
  最后启动服务:

using System;
using com.jnbridge.jnbcore;

namespace NET_Service
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(".NET Start!");
//启动.NET端服务,注意必须添加对JNBShare的引用,才可使用com.jnbridge.jnbcore.DotNetSide
DotNetSide.startDotNetSide();
Console.ReadKey();
//关闭.NET端服务
DotNetSide.stopDotNetSide();
}
}
}
  生成转换层代码

打开JNBridge,选择工具栏 “Add class from assembly files”,分别加入Model.dll,Manager.dll及mscorlib.dll(此程序集存在于“C:\Windows\Microsoft.NET\Framework\v4.0.30319\”,里面包含System,System.Collections,System.IO等等重要的命名空间)

在选择必要的类以后,按下“Project->Build",系统就会对应选择把.NET里面的类生成对class放入Proxy.jar代理包。

Java端开发

新建一个Java项目,引用刚生成的代理包Proxy.jar,还有jnbcore.jar、bcel-5.1-jnbridge.jar(在5.1版本中,这两个文件存在于“/JNBridge/JNBridgePro v5.1/jnbcore/”),把JNBridge的TCP配置文件jnbcore_tcp.properties复制到bin文件夹内,开发一个测试端。值得注意的是在生成Proxy.jar代码包的时候,必须对System.Collections.Generic,System.String等等这些常用类的空间添加引用,否则,在Java里面就无法调用.NET里面的System.Collections.Generic.List等这些常用类。由于在Java里面对像List这些常用的类具有类名之间的冲突,所以在Proxy里面会对System.Collections.Generic.List这些类命名为System.Collections.Generic.List_1。

package com.jnbridge.javaclient;

import com.jnbridge.jnbcore.*;

import System.Collections.Generic.*;
//引用Proxy.jar包内System.Collection.Generice.*空间里面的代理类

import Manager.;
import Model.
;

public class Test {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    try{
    //注册JNBridge的TCP配置文件jnbcore_tcp.properties
    DotNetSide.init("E:\\Java Projects\\JNBridge JAVA\\JAVA Client\\bin\\jnbcore_tcp.properties");
    
    PersonManager personManager=new PersonManager();
    //注意此List_1是Proxy.jar包内System.Collections.Generic.List的代理类,而并非JDK内自带的List类
    List__1 personList=personManager.GetList();
    if(personList.Get_Count()!=0){
        //注意此Get_Count()方法是Proxy.jar包内System.Collections.Generic.List代理类的GetCount()方法
        for(int n=0;n<personList.Get_Count();n++){
            Person person=(Person)personList.Get_Item(n);
              System.out.println("Id:"+person.Get_ID()+" Age:"+person.Get_Age()+" Name:"+person.Get_Name());  
        }
    }
    }catch(Exception ex){
        ex.printStackTrace();
    }
}

}
深圳网站建设www.sz886.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值