Optimize with a SATA RAID Storage Solution
Range of capacities as low as $1250 per TB. Ideal if you currently rely on servers/disks/JBODs
Page 2 of 7

A Java instance of NumberListProxy needs to hold onto a reference to the corresponding C++ instance of NumberList. This is easy enough, if slightly non-portable: If we're on a platform with 32-bit pointers, we can simply store this pointer in an int; if we're on a platform that uses 64-bit pointers (or we think we might be in the near future), we can store it in a long. The actual code for NumberListProxy is straightforward, if somewhat messy. It uses the mechanisms from the "Integrating Native Methods into Java Programs" section of SunSoft's Java Tutorial.
A first cut at the Java class looks like this:
public class NumberListProxy {
static {
System.loadLibrary("NumberList");
}
NumberListProxy() {
initCppSide();
}
public native void addNumber(int n);
public native int size();
public native int getNumber(int i);
private native void initCppSide();
private int numberListPtr_;
// NumberList*
}
The static section is run when the class is loaded. System.loadLibrary() loads the named shared library, which in our case contains the compiled version of C++::NumberList. Under Solaris, it will expect to find the shared library "libNumberList.so" somewhere in the $LD_LIBRARY_PATH. Shared library naming conventions may differ in other operating systems.
Most of the methods in this class are declared as "native." This means that we will provide a C function to implement them. To write the C functions, we run javah twice, first as "javah NumberListProxy," then as "javah -stubs NumberListProxy." This automatically generates some "glue" code needed for the Java runtime (which it puts in NumberListProxy.c) and generates declarations for the C functions that we are to implement (in NumberListProxy.h).
I chose to implement these functions in a file called NumberListProxyImpl.cc. It begins with some typical #include directives:
//
//
NumberListProxyImpl.cc
//
//
// This file contains the C++ code that implements the stubs generated
// by "javah -stubs NumberListProxy".
cf. NumberListProxy.c.
#include <StubPreamble.h>
#include "NumberListProxy.h"
#include "NumberList.h"
<StubPreamble.h> is part of the JDK, and includes a number of important system declarations. NumberListProxy.h was generated for us by javah, and includes declarations of the C functions we're about to write. NumberList.h contains the declaration of the C++ class NumberList.
In the NumberListProxy constructor, we call the native method initCppSide(). This method must find or create the C++ object we want to represent. For the purposes of this article, I'll just heap-allocate a new C++ object, although in general we might instead want to link our proxy to a C++ object that was created elsewhere. The implementation of our native method looks like this:
void NumberListProxy_initCppSide(struct HNumberListProxy *javaObj)
{
NumberList* list = new NumberList();
unhand(javaObj)->numberListPtr_ = (long) list;
}
As described in the Java Tutorial, we're passed a "handle" to the Java NumberListProxy object. Our method creates a new C++ object, then attaches it to the numberListPtr_ data member of the Java object.