56
Copyright 2004 by Codemesh, Inc. All Rights Reserved Welcome Jini in a .NET Environment by Alexander Krapf Jini Community Meeting Cambridge March 23-35, 2004

Copyright 2004 by Codemesh, Inc. All Rights Reserved Welcome Jini in a.NET Environment by Alexander Krapf Jini Community Meeting Cambridge March 23-35,

Embed Size (px)

Citation preview

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Welcome

Jini in a .NET Environment

by

Alexander Krapf

Jini Community MeetingCambridge

March 23-35, 2004

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Speaker

Co-founder & President of Codemesh, Inc.

16 years of C++ development experience

7 years of Java development experience

2 years of .NET experience 5 years of integration of Java with other languages

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Agenda

Why should I care about .NET?

General Integration Approaches

What makes Jini a special case?

Integration Details

Type Mapping

Integration Architecture

P/Invoke & JNI

Demonstration

Q & A

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Why would I want to do that ?

Jini and .NET

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Jini and .NET ... Why?

Because .NET is becoming the de-facto standard for Microsoft centric development

Because .NET has nothing like Jini

Because .NET does have some redeeming features

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Jini and .NET ... Why?

Because we’re not religious about technology. We mix and match where appropriate!

Because we want Jini to succeed, and for that it can’t be seen as Java-only

Because we benefit from promoting Java “guts” technologies to .NET users

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Jini and .NET ... Why?

Because I would hate to see distributed computing dominated by J2EE and Web Services

Because not everyone develops software in Java

Copyright 2004 by Codemesh, Inc. All Rights Reserved

What does an integration look like?

Example 1: JavaSpaces

JavaSpace JavaSpace

Java Servers

Java Client

VB.NET Client

C# Client

Copyright 2004 by Codemesh, Inc. All Rights Reserved

What does an integration look like?

Example 2: Service Oriented Architecture

Jini Service

C# Client

Java Client

Not a very exciting slide, but an exciting design!

VB Client

Copyright 2004 by Codemesh, Inc. All Rights Reserved

OK, I buy the occasional need, but what exactly

does “Jini and .NET” mean ?

Jini and .NET

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Definition of Java

What is the Java platform?

JVM Spec

Language Spec

Class Libraries

Runtime Environment

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Definition of .NET

What is the .NET platform?

CLR

CTS

CLS

CIL

C#Language

Spec

VB.NETLanguage

Spec

mC++Language

Spec

HostSpec

CLR: Common Language Runtime

CIL: Common Intermediate Language

CTS: Common Type System

CLS: Common Language Specification

Copyright 2004 by Codemesh, Inc. All Rights Reserved

What we really want

Define the goals

Write C#, VB, C++, etc. source code that “links with” arbitrary Jini code easily

Use all important Jini features from .NET, including callbacks

Impose no prohibitive performance penalty

Write C#, VB, C++, etc. source code that allows natural use of all native features

Copyright 2004 by Codemesh, Inc. All Rights Reserved

What we really want (cont.)

[STAThread]static void Main(string[] args){ Hashtable ht = new Hashtable();

ht.put( Context.PROVIDER_URL, “file://mydir” ); ht.put( Context.INITIAL_CONTEXT_FACTORY, “MyICtx” );

InitialContext ictx = new InitialContext( ht ); Context ctx = (Context)ictx.lookup( “test” );

… }

Write C# code like this:

Copyright 2004 by Codemesh, Inc. All Rights Reserved

What we really want (cont.)

[STAThread]static void Main(string[] args){ Hashtable ht = new Hashtable();

ht.put( Context.PROVIDER_URL, “file://mydir” ); ht.put( Context.INITIAL_CONTEXT_FACTORY, “MyICtx” );

InitialContext ictx = new InitialContext( ht ); Context ctx = (Context)ictx.lookup( “test” );

… }

Lots of Problems in a short snippet!

Copyright 2004 by Codemesh, Inc. All Rights Reserved

The Jini twist on theJava/.NET integration

problem…

Jini and .NET

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Application

Why it is a hard problem…

Jini leverages Java!

RMI/code mobility

Security/Classloaders

Platformindependence

JINI

Application #2Application #1

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Integrating Jini with .NET ... How?

Must accommodate downloaded code

Must support RMI

Must support Java and Jini security

Must support callbacks

Technical Requirements

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Integrating Jini with .NET ... How?

Serialization/Message-based:

CORBA, Webservices, MOM, custom

Translation-based:

Java to C#, Bytecode to IL

Proxy-based:

Java Native Interface

managed C++ or PInvoke

Architectural Alternatives

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Serialization/Message-Based

CORBA

WebServices

MOM

Custom

- database

- filesystem

- sockets

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Serialization/Message-Based

Different technologies, same principles

- argument/result serialization through

IIOP, SOAP, XML, ...

- object/service discovery through

naming service, UDDI, custom registries

- several processes or “objects” involved

Java process, .NET process,

file locks, table rows, helpers

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Translation-Based Integration

Large set of classes involvedtransitive closure for Object: ~ 260 classes

Still need JRE or reimplementation of all native libraries

IL is very different from JVM bytecode

Interface/Implementation designs are problematic

Reflection, Class.forName() are problematic

Promising at first, but very problematic

“Stale bits” are uncheckable and out-of-date

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Proxy-Based Solution

Jini Example

Java Server

Service

.NET Client

Proxy’

RuntimeLibrary

Service

JVM

Proxy

ProxyProxy’

Client Process Server Process

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Proxy-Based Solution

JVM C

JNI

DLL

GeneratedProxy

Classes(C#)

C#

PInvoke

assembly

API

.NETUser

Architectural Diagram

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Proxy-Based Solution

Performance Characteristics

Design and Implementation have huge impact on performance

0-200% overhead, depending on application

Negligible overhead in most applications

up to 25% overhead in most others

Strings can be relatively costly

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Proxy-Based Solution

xcopy Deployment

<myapp>

bin application binaries and config files

lib application Java classes (jar,zip)

jre private Java runtime environment

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Proxy-Based Solution

Threading Model

public static void main(String[] args ){ Runnable r = new MyRunnable();

new Thread( r ).start();

…}

How does this code behave in Java and in .NET ?

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Type Mapping

The Common Language Runtime

provides access to

the .NET class library or

libraries that are based upon it

using the language bindings of your choice.

What about the Java class library?

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Type Mapping

General Issues

Both platforms have object models

Slightly incompatible specifications

Both platforms have class libraries

Typenames are duplicated

Different Naming Policies

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Object Model Mapping

class to class

interface to interface

constructor to constructor

method to method

field to property

Overall a good match

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Object Model Mapping

conflicting Array models

conflicting Exception models

cannot declare static members for interfaces (CLS)

CLS has more restrictive naming than Java

But there are problems

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Object Model Mapping

both sides use garbage collection

JNI references need to be freed explicitly

IDisposable together with finalization offer what we need

Care required with callbacks!

Object Lifecycle

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Object Model Mapping

Classes

Java .NET

Object

String Throwable

Exception

RuntimeException

Error

Object

String Exception

ApplicationException

SystemException

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Custom TypeCustom Type

Custom Type

CustomExceptionCustom

ExceptionCustomException

Type System Mapping

.NET with mapped Java Types

Object

Throwable

Exception

RuntimeException

Error

Object

String Exception

ApplicationException

SystemException

String

Neither Strings nor Throwablesare Java Objects anymore!

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Object Model Mapping

Java proxy types should extend proxy Object type (with exceptions)

Every proxy type must be usable in all places where Java Object is legal

Object Requirements

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Object Model Mapping

.NET string literals must be usable in places where Java strings are expected

.NET string literals must be usable in places where Java strings are legal

String Requirements

Object put( Object key, Object value )

String getProperty( String name )

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Object Model Mapping

java.lang.String must map to System.String because of literals

Large impact on Object-type elements

String Mapping

Object put( Object key, Object value )

becomes

object put( object key, object value )

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Object Model Mapping

interface types must be usable in all places where Java uses the Object type

interface inheritance (multiple interfaces, directly and indirectly)

static interface elements

polymorphic use (concrete object used through interface type)

Interface Requirements

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Object Model Mapping

Every Java interface maps to a .NET interface and a .NET class

.NET interface type used for declarations

.NET class type used for instantiation of proxy objects and to hold static elements

Which one gets the natural name?

Interface Mapping

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Object Model Mapping

Allow subscript operator to access element

Allow built-in semantic uses

Use native arrays and proxy arrays interchangably

Array Requirements

arrInt[ 42 ] += 5;

foreach( int i in arrInt ) sum += i;

int[] arrNative = new int[ 5 ];result = MyProxyClass.sumItUp( arrNative );

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Object Model Mapping

Cannot extend System.Array, so fully functional .NET arrays are not possible

Proxy array type declares index operator for 90% of desired functionality

Conversion operators provide ability to use .NET array types interchangeably

Array Mapping

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Object Model Mapping

No exception specification clause in .NET method declarations!

Need to extend System.Exception or subclass

Cannot extend java.lang.Object proxy class!

May need special serialization support

Exceptions

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Object Model Mapping

Java fields map extremely well to .NET properties

Care needs to be taken with static interface fields (Impl classes)

final fields translate to read-only properties

Fields

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Object Model Mapping

Fields

Java .NET

interface Context{ public static final String PROVIDER_URL = “…”;}

interface Context{}

public class ContextImpl : Context{ public static string PROVIDER_URL { get { return …; } }}

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Object Model Mapping

Anatomy of a Field Access

f.x = 5;

.NET Application Code

public int x {

set { fx.set( value ); }}

.NET Generated Code

PInvokeHelper.set( fx, value );

.NET Runtime Assembly

JNIHelper.set( obj, value );

C Runtime DLL

env->SetIntField( obj, fid, value );

C JVM

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Object Model Mapping

because we’re dealing with managed code, we can directly map all constructors

no throws clause

Special cases for methods like toString(), equals(Object), etc.

Methods and Constructors

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Object Model Mapping

All non-static Java methods are implicitly virtual

.NET methods can choose virtual is explicit, optional keyword

Which virtual resolution mechanism should we use?

Virtual Methods

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Specification Incompatibilities

Corresponding methods of same name but different specification

Corresponding methods with different names but identical specification

CLS Type restrictions

Naming rules (CLS generally more restrictive than JLS)

Different APIs, same purpose (Iterator vs. IEnumerable etc.)

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Naming Policy

Offer alternatives:

Keep Java names or

Uppercase first character or

Prefix I for interface names

What’s the right way to name .NET proxies for Java types?

Very important for usability

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Naming Policy

Take care with CLS constraints!

No identifiers that only differ in case at same scope

No elements of same name but different element type (method and field of same name, class and method of same name)

Don’t break contracts when changing names!

Copyright 2004 by Codemesh, Inc. All Rights Reserved

PInvoke

A way to call unmanaged code from managed code

Managed Code (in assembly)

class MyInvoker{ [DllImport(“myunmanaged.dll”)] public static extern int callMe( int val );}

Unmanaged Code (in myunmanaged.dll)

extern “C” __declspec(dllexport) int __stdcall callMe( int val );

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Using JNI (Example)

jclass cl = env->FindClass( “com.codemesh.MyClass” );

if( cl == 0 ) { jthrowable t = env->ExceptionOccurred(); env->ExceptionClear(); return;}

jmethodID mid = env->GetMethodID( cl, “<init>”,“(Ljava/lang/String;IIZ)V” );

if( mid == 0 ) { jthrowable t = env->ExceptionOccurred(); env->ExceptionClear(); env->DeleteLocalRef( cl ); return;}

jstring arg1 = env->NewStringUTF( “test” );

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Using JNI (Example) cont.

jobject temp = 0, result = 0;

temp = env->NewObject( cl, mid, arg1, 1, 2, JNI_TRUE );

if( temp == 0 ) { jthrowable t = env->ExceptionOccurred(); env->ExceptionClear(); env->DeleteLocalRef( cl ); return;}

result = env->NewGlobalRef( temp );env->DeleteLocalRef( temp );

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Demonstration

A look at the demo source code

A look at particular features of the

enabling source code

A look at a code generator

A Jini example:

hello in C#

Q & A

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Literature/References

The Java Native Interface, Programmer’s Guide and Specificationby Sheng Liang, Addison-Wesley, ISBN 0-201-32577-2

Essential JNIby Rob Gordon, Prentice Hall, ISBN 0-136-79895-0

.NET and COM, The Complete Interoperability Guide by Adam Nathan, SAMS, ISBN 0-672-32170-X

JNI Documentationhttp://java.sun.com/products/jdk/1.2/docs/guide/jni/

JGuruhttp://www.jguru.com

Stu Halloway’s Java Interop sitehttp://staff.develop.com/halloway

Copyright 2004 by Codemesh, Inc. All Rights Reserved

Thank you!

Codemesh, Inc.P.O.Box 620Carlisle, MA 01741

http://[email protected]

I’ll be aroundfor more questions!