Welcome!

Java IoT Authors: Liz McMillan, Elizabeth White, Pat Romanski, William Schmarzo, Stackify Blog

Related Topics: Java IoT, Open Source Cloud

Java IoT: Article

j-Interop: An Open Source Library for COM Interoperability Without JNI

A search for pure, non-native, bi-directional interoperability with COM servers

I have spent a good part of the last year trying to "wrap" COM servers in Java for a content management organization. It had an array of syndication servers supported by an integrated messaging platform developed using COM. The purpose of this exercise was to increase the organization's market penetration by hooking on to the J2EE bandwagon across multiple platform configurations. With so many different complex COM servers to work with, some supporting automation and others not, I struggled with the all too familiar JNI cycle...code, crash, code some more, and then crash. Literally speaking, I must have brought down the JVM hundreds of times. To top it off, some syndication servers worked on a "pull" mechanism, they could pull the content out from the interfacing repositories. This meant bi-directional access and an event-based interoperation.

I had a look at some Open Source projects, but they were all using native libraries and didn't sufficiently meet the requirements in hand. Ultimately, we did complete a scaled-down version of the project. I'm quite sure that most of the requirements could have been handled if a non-native solution (in the Open Source community) existed to COM interoperability.

There are a number of reasons why I believe JNI shouldn't be used for accessing COM. It may work well for a small-sized project (two or three COM servers, no bi-directional access, etc.). But for any serious initiatives, I think it has certain drawbacks. Though JNI is Java, you still need to know a lot more about the native component and the target architecture before accessing its services. One has to be proficient in Java and in the native programming language as well (some Open Source projects are trying to address this complexity, i.e., trying to abstract JNI itself). With increasing demands to deliver on time - before time, and the delivery having quality, it's usually hard to find such cross-platform resources. The native and Java layers are so tightly coupled that having dedicated resources for each proves more of a headache than a solution.

I'm pretty sure that it's obvious to you that by linking with native code, JNI takes away one of the most powerful features of the language itself, "platform independence" (write once, run anywhere). It binds the application to the host platform. For example, when using JNI in a Windows environment, the Java application is forced to rely on the native DLLs for its functionality. The same application can't be ported without porting the native library to another platform. This also requires a proxy/stub approach when you want to access a COM server from Unix. This is an invasive procedure (you are deploying a potentially unknown code on the machine where the COM server is located, even if it's in the same intranet) and may not be allowed by the administrative policies governing the domain.

Another disadvantage, when linking with native code is the instability it may bring with it. A poorly written DLL (speaking of Windows) will bring down an entire JVM, taking with it some vital applications. And of course, try debugging that!

The architectures built on JNI look more or less like Figure 1.

Okay well...so what can be done about it? I sat down some months ago to develop an open source library that implements the DCOM protocol, thus allowing for pure, non-native, bi-directional interoperability with COM servers.

I'll try explaining my work in two steps. First I'll give you a primer on DCOM and its inner workings and then I'll talk about j-Interop. If you know how DCOM functions <i> under the hood</i>, you can skip to the section about j-Interop.

DCOM: What and How
Distributed COM or DCOM is a high-level network protocol developed to provide location transparency to COM-based components. The keywords being network protocol and location transparency. Traditional COM components can only perform inter-process communication across process boundaries on the same machine. DCOM uses an RPC mechanism to send and receive information transparently between COM components (clients and servers) on the same network. DCOM was first made available in 1995 with the initial release of Windows NT 4. Essentially, it serves the same purpose as CORBA or RMI. Please have a look at Figure 2.

In terms of an ISO OSI protocol stack, this is how it looks (see Figure 3).

As you can see, DCOM is an application level protocol. It leverages most of the functionality offered by DCE/RPC (see the side bar for a brief overview of DCE/RPC). Since DCE/RPC isn't naturally object-oriented, Microsoft's implementation enhanced the protocol by adding new constructs and providing different meanings to some of the packet fields. This enhanced protocol was christened the Object RPC (ORPC) or MS-RPC. Another significant change that Microsoft made to the protocol was the addition of an NTLM Security Service Provider. One disadvantage of this was the impossibility of any interoperability with other implementations of DCOM on platforms that don't have NTLM, since NTLMSSP is available only in MS-RPC.

Let's see how DCOM works.

DCOM (MS-RPC): Under the Hood
The best way to explain the inner workings of DCOM would be by creating a (COM) client/(COM) server application. I've used Visual Studio to create one. Since "how" to create a COM server (from now on referred to as a COM component) is outside the scope of this article, I won't be mentioning it here. It's best left for a tutorial.

Our COM component is an "out of process" server, i.e., an EXE. For the sake of brevity, it has a single interface "ITestCOMServer" that has a single API call, "Add," that adds two integers and returns the result. Also note, this example is void of any error checks.

HRESULT Add (int x, int y, [out] int* result);

The COM client will execute this API.

The first step is to obtain the "handle" to the COM class serving this interface. The following calls instantiate the COM server and also provide a pointer to its IUnknown interface.

IUnknown *ptrUnknown = NULL;
IITestCOMServer *ptrTestServer = NULL;
HRESULT hr = CoCreateInstance (CLSID_ITestCOMServer, NULL, CLSCTX_REMOTE_SERVER, IID_IUnknown,
(void**)&ptrUnknown);

The second step entails getting a pointer to the actual interface in which the "Add" method resides.

hr = ptrUnknown->QueryInterface(IID_IITestCOMServer, (void**)&ptrTestServer);

if (FAILED(hr))
{
cout << "Failed to get interface pointer, quitting";
}

The third step requires us to execute the "Add" API on the pointer obtained in step 2.

else
{
    int *result = new int;
    hr = ptrTestServer->Add(1,2,result);
    cout << "result of Add is " <<*result;
delete result;
}

The last step is to release all references to the COM server and let the COM runtime garbage collect it.

if (ptrTestServer)
{
ptrTestServer->Release();
}

ptrUnknown->Release();

Simple isn't it? Well, the COM runtime does a lot of work to orchestrate this cycle. Let me try to give you an overview of what happens behind the scenes. (Sources: www.opengroup.org, www.msj.com March 1998, DCOM specification)

1.  Each Windows machine on the network has a subsystem known as the Service Control Manager (not to be confused with the Windows "Services" system). It's a DCE/RPC server that listens at port 135 and runs inside rpcss.exe. The SCM makes sure that when a client request is made, the appropriate COM server is connected and ready to receive the request. It provides an RPC interface, known as IRemoteActivation, which has only a single operation, "RemoteActivation," designed to activate a COM server on a remote machine. This, by the way, is an important difference between DCOM and classic RPC where the server must be running before the client can connect to it. The SCM resides at well-known endpoints, one for each supported network protocol (135 for TCP/UDP).
2.  When the client gets a "CoCreateInstance" call with the execution context set as Remote (CLSCTX_REMOTE_SERVER specifies to the runtime that the COM server is located on a remote machine), the COM runtime consults the Windows registry for the "RemoteServerName" named-value. This value is located at [HKEY_CLASSES_ROOT\APPID\(CLSID of TestCOMServer)]. If a machine name is found under this key then the request to activate the COM server is forwarded to SCM on that remote machine. The remote SCM uses the IRemoteActivation interface to activate the object identified by CLSID_ITestCOMServer.
3.  What does it mean to "activate" a COM object? We will get to that after I talk about the IOxidResolver. I think it's important to clear these basics up otherwise things could become quite confusing.

Each machine that supports the COM network protocol supports a one-per-machine service known as the "OXID Resolver." Like the SCM, it also contains an RPC interface "IOxidResolver." Oxid Resolver performs many important operations, primarily maintaining the binding information necessary to connect to the COM components being exported. It also takes care of keeping the exported objects alive by receiving pings from the COM clients (otherwise they'd be garbage collected) and does lazy protocol registration for servers scoped by the Oxid Resolver. I'll explain this last point a bit more. Each COM server can decide to support a certain set of protocols over which it can be contacted. For example, a server may want to answer only on UDP or TCP or HTTP or all three. Instead of reserving ports for each protocol even before it's activated, a server delays this to the time it's actually activated on a requested protocol. This is quite useful in preventing the machine from running out of ports.
4.  Okay, coming back to activation. Activation should be seen as a set of activities that bring a COM server to a "ready to receive requests" state. In general, it means locating the COM server on the remote machine using the Windows registry, registering its connection information with the Oxid Resolver, marshaling the reference to its IUnknown (rather the "IRemUnknown") interface, and sending it back to the callee (explained in step 7).
5.  On the remote machine, when the server is started by its SCM, two activities take place.

  • The server is associated with an "object exporter" and assigned an object exporter identifier (OXID). An object exporter keeps track of all the interfaces (like in our case ITestCOMServer), which this COM server will export or import.
  • The COM runtime also associates an "Oxid Object" with the COM server, which implements the COM interface "IRemUnknown." It forms the remote proxy for the base "IUnknown" interface. Please note the standard IUnknown interface is never remoted in COM. In its place, the IRemUnknown interface is remoted and results in local calls to QueryInterface, AddRef, and Release on the server.

    At activation time, the RPC binding information of the OXID is also registered with the server-side OXID Resolver. These are full bindings carrying the "How-To-Connect" information (including the supported protocol/port combination) of the COM server. This information is used by the underlying RPC mechanism of the client system to initiate a session with the COM server. One more point worth mentioning is that during activation the server has the choice of being "ready" now or waiting for the first call to come (lazy activation). Usually all servers prefer to be lazy till an actual call comes (initially IRemUnknown) on a specific binding.

6.  I've talked about the SCM and the Oxid Resolver service. They are important infrastructure services. One provides for activation and the other for ```discovering the path and means to the activated object.
7.  Up until now, in executing "CoCreateInstance" we've been able to activate a COM object. We still need to return the interface pointer, which will uniquely identify this activated COM object and allow us further operations on it (like a QueryInterface). Microsoft extended the Network Data Representation (the presentation layer protocol responsible for packaging semantics of the DCE/RPC datatypes) to add the concept of a "Marshaled Interface Pointer" (MIP from hereon). The MIP symbolically represents an interface reference to an object. It consists of two elements, an array of bytes and a marker specifying how to interpret this array of bytes. There are three variations to the interpretation, but I'll stick to the STANDARD type.

The array of bytes representing the STANDARD interface pointer consists primarily of a 128-bit GUID known as IPID, short for interface identifier, that uniquely identifies an interface - it has a one-to-one mapping with each marshaled interface, i.e., ITestCOMServer will have a single IPID - an OXID and a 64-bit object ID (OID) that uniquely identifies the object on which the IPID is found. There's one-to-one mapping between an object instance (implementing one or more interfaces thus IPIDs) and the OID. This OID is quite useful during pinging. Along with all this the MIP also contains the full bindings for the OXID Resolver service running on the remote machine.
8.  When the marshaled interface pointer is returned to the client side through the server-side and client-side SCMs, the COM runtime extracts the OXID, addresses the remote OXID Resolver from MIP, and calls the ResolveOxid() method on its local OXID Resolver to get the bindings ("how to connect" information) identified by the OXID (it has to reach the COM server now for further operations).
9.  The clients-side OXID Resolver checks to se if it has a cached mapping for the OXID; if not, it invokes the ResolveOxid() method of the server-side OXID Resolver - it can since it has the address information from the MIP - which returns the registered RPC binding of the COM server.
10.  The client-side Resolver caches the mappings, and returns the RPC bindings of the COM server to the COM runtime. This lets the runtime create an RPC channel that's connected to the Object exporter of the COM server.
11.  The CoCreateInstance call is now complete.


More Stories By Vikram Roopchand

Vikram Roopchand is a Technical Architect working for Infosys Technologies Ltd. (www.infosys.com). He has about 8.5 years of experience and specializes in Cross Platform development across Content Management and Business Intelligence domains.

Comments (1) View Comments

Share your thoughts on this story.

Add your comment
You must be signed in to add a comment. Sign-in | Register

In accordance with our Comment Policy, we encourage comments that are on topic, relevant and to-the-point. We will remove comments that include profanity, personal attacks, racial slurs, threats of violence, or other inappropriate material that violates our Terms and Conditions, and will block users who make repeated violations. We ask all readers to expect diversity of opinion and to treat one another with dignity and respect.


Most Recent Comments
Peter 01/11/07 07:17:29 PM EST

Fantastic article! I wish I had this library back in 99!

@ThingsExpo Stories
What is the best strategy for selecting the right offshore company for your business? In his session at 21st Cloud Expo, Alan Winters, U.S. Head of Business Development at MobiDev, will discuss the things to look for - positive and negative - in evaluating your options. He will also discuss how to maximize productivity with your offshore developers. Before you start your search, clearly understand your business needs and how that impacts software choices.
SYS-CON Events announced today that Interface Corporation will exhibit at the Japan External Trade Organization (JETRO) Pavilion at SYS-CON's 21st International Cloud Expo®, which will take place on Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. Interface Corporation is a company developing, manufacturing and marketing high quality and wide variety of industrial computers and interface modules such as PCIs and PCI express. For more information, visit http://www.i...
SYS-CON Events announced today that Keisoku Research Consultant Co. will exhibit at the Japan External Trade Organization (JETRO) Pavilion at SYS-CON's 21st International Cloud Expo®, which will take place on Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. Keisoku Research Consultant, Co. offers research and consulting in a wide range of civil engineering-related fields from information construction to preservation of cultural properties. For more information, vi...
SYS-CON Events announced today that MIRAI Inc. will exhibit at the Japan External Trade Organization (JETRO) Pavilion at SYS-CON's 21st International Cloud Expo®, which will take place on Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. MIRAI Inc. are IT consultants from the public sector whose mission is to solve social issues by technology and innovation and to create a meaningful future for people.
SYS-CON Events announced today that Fusic will exhibit at the Japan External Trade Organization (JETRO) Pavilion at SYS-CON's 21st International Cloud Expo®, which will take place on Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. Fusic Co. provides mocks as virtual IoT devices. You can customize mocks, and get any amount of data at any time in your test. For more information, visit https://fusic.co.jp/english/.
SYS-CON Events announced today that N3N will exhibit at SYS-CON's @ThingsExpo, which will take place on Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. N3N’s solutions increase the effectiveness of operations and control centers, increase the value of IoT investments, and facilitate real-time operational decision making. N3N enables operations teams with a four dimensional digital “big board” that consolidates real-time live video feeds alongside IoT sensor data a...
Mobile device usage has increased exponentially during the past several years, as consumers rely on handhelds for everything from news and weather to banking and purchases. What can we expect in the next few years? The way in which we interact with our devices will fundamentally change, as businesses leverage Artificial Intelligence. We already see this taking shape as businesses leverage AI for cost savings and customer responsiveness. This trend will continue, as AI is used for more sophistica...
Real IoT production deployments running at scale are collecting sensor data from hundreds / thousands / millions of devices. The goal is to take business-critical actions on the real-time data and find insights from stored datasets. In his session at @ThingsExpo, John Walicki, Watson IoT Developer Advocate at IBM Cloud, will provide a fast-paced developer journey that follows the IoT sensor data from generation, to edge gateway, to edge analytics, to encryption, to the IBM Bluemix cloud, to Wa...
SYS-CON Events announced today that Massive Networks, that helps your business operate seamlessly with fast, reliable, and secure internet and network solutions, has been named "Exhibitor" of SYS-CON's 21st International Cloud Expo ®, which will take place on Oct 31 - Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. As a premier telecommunications provider, Massive Networks is headquartered out of Louisville, Colorado. With years of experience under their belt, their team of...
SYS-CON Events announced today that Enroute Lab will exhibit at the Japan External Trade Organization (JETRO) Pavilion at SYS-CON's 21st International Cloud Expo®, which will take place on Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. Enroute Lab is an industrial design, research and development company of unmanned robotic vehicle system. For more information, please visit http://elab.co.jp/.
SYS-CON Events announced today that Mobile Create USA will exhibit at the Japan External Trade Organization (JETRO) Pavilion at SYS-CON's 21st International Cloud Expo®, which will take place on Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. Mobile Create USA Inc. is an MVNO-based business model that uses portable communication devices and cellular-based infrastructure in the development, sales, operation and mobile communications systems incorporating GPS capabi...
There is huge complexity in implementing a successful digital business that requires efficient on-premise and cloud back-end infrastructure, IT and Internet of Things (IoT) data, analytics, Machine Learning, Artificial Intelligence (AI) and Digital Applications. In the data center alone, there are physical and virtual infrastructures, multiple operating systems, multiple applications and new and emerging business and technological paradigms such as cloud computing and XaaS. And then there are pe...
SYS-CON Events announced today that SIGMA Corporation will exhibit at the Japan External Trade Organization (JETRO) Pavilion at SYS-CON's 21st International Cloud Expo®, which will take place on Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. uLaser flow inspection device from the Japanese top share to Global Standard! Then, make the best use of data to flip to next page. For more information, visit http://www.sigma-k.co.jp/en/.
SYS-CON Events announced today that B2Cloud will exhibit at SYS-CON's 21st International Cloud Expo®, which will take place on Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. B2Cloud specializes in IoT devices for preventive and predictive maintenance in any kind of equipment retrieving data like Energy consumption, working time, temperature, humidity, pressure, etc.
Agile has finally jumped the technology shark, expanding outside the software world. Enterprises are now increasingly adopting Agile practices across their organizations in order to successfully navigate the disruptive waters that threaten to drown them. In our quest for establishing change as a core competency in our organizations, this business-centric notion of Agile is an essential component of Agile Digital Transformation. In the years since the publication of the Agile Manifesto, the conn...
While some developers care passionately about how data centers and clouds are architected, for most, it is only the end result that matters. To the majority of companies, technology exists to solve a business problem, and only delivers value when it is solving that problem. 2017 brings the mainstream adoption of containers for production workloads. In his session at 21st Cloud Expo, Ben McCormack, VP of Operations at Evernote, will discuss how data centers of the future will be managed, how th...
SYS-CON Events announced today that NetApp has been named “Bronze Sponsor” of SYS-CON's 21st International Cloud Expo®, which will take place on Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. NetApp is the data authority for hybrid cloud. NetApp provides a full range of hybrid cloud data services that simplify management of applications and data across cloud and on-premises environments to accelerate digital transformation. Together with their partners, NetApp em...
SYS-CON Events announced today that Nihon Micron will exhibit at the Japan External Trade Organization (JETRO) Pavilion at SYS-CON's 21st International Cloud Expo®, which will take place on Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. Nihon Micron Co., Ltd. strives for technological innovation to establish high-density, high-precision processing technology for providing printed circuit board and metal mount RFID tags used for communication devices. For more inf...
SYS-CON Events announced today that Suzuki Inc. will exhibit at the Japan External Trade Organization (JETRO) Pavilion at SYS-CON's 21st International Cloud Expo®, which will take place on Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. Suzuki Inc. is a semiconductor-related business, including sales of consuming parts, parts repair, and maintenance for semiconductor manufacturing machines, etc. It is also a health care business providing experimental research for...
SYS-CON Events announced today that Ryobi Systems will exhibit at the Japan External Trade Organization (JETRO) Pavilion at SYS-CON's 21st International Cloud Expo®, which will take place on Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. Ryobi Systems Co., Ltd., as an information service company, specialized in business support for local governments and medical industry. We are challenging to achive the precision farming with AI. For more information, visit http:...