Hi all,

I am trying to write a web service in which some of the functionality will be implemented in C++, and hence I'll need JNI. However, I have not been able to make it work.

So, I decided to make a toy web service to understand how things will work. The toy web service will have one operation which tell whether a number is prime. And I'll implement this prime checking function in C++. I did the following stuff and hoped things would work, but they didn't.

Here is the wsdl file :
----------------------------------------------------
<?xml version="1.0" ?>

<definitions name="PrimeDef"
        targetNamespace="http://iitd/csd99440/ws5/";
        xmlns:tns="http://iitd/csd99440/ws5/";
        xmlns:xsd="http://www.w3.org/1999/XMLSchema";
        xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/";
        xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/";
        xmlns="http://schemas.xmlsoap.org/wsdl/";>

    <message name="aNumber">
        <part name="num" type="xsd:int"/>
    </message>

    <message name="aBool">
        <part name="boo" type="xsd:boolean"/>
    </message>

    <portType name="Prime">
        <!-- Tell if a given number is prime -->
        <operation name="isPrime">
            <input message="tns:aNumber"/>
            <output message="tns:aBool"/>
        </operation>
    </portType>

    <binding name="PrimeSOAPBinding" type="tns:Prime">
        <soap:binding style="rpc"
                transport="http://schemas.xmlsoap.org/soap/http"/>

        <operation name="isPrime">
            <soap:operation soapAction=""/>
            <input>
                <soap:body use="encoded" encodingStyle="soap-enc"/>
            </input>
            <output>
                <soap:body use="encoded" encodingStyle="soap-enc"/>
            </output>
        </operation>

   </binding>

    <!-- Service declaration -->
    <service name="Primality">
        <port name="Prime" binding="tns:PrimeSOAPBinding">
            <soap:address location="http://localhost:9440/axis/services/Prime"/>
        </port>
    </service>

</definitions>
-----------------------------------------
(Please change the namespace and port number if you experiment with this.)

I generate the server side code by WSDL2Java, and in the file PrimeSOAPBindingImpl, I do the following :

    public boolean isPrime(int num) throws java.rmi.RemoteException {
        return is_prime(num);
    }

    public native boolean is_prime(int x);

    static {
        System.loadLibrary("libMyPrime.so");
    }

I then compiled the code. To the compiled class, I do the following, to generate the header file.

javah iitd.csd99440.ws5.PrimeSOAPBindingImpl

The header file is generated and I implement the required functionality in a file checkPrime.cpp :
----------------------------
#include <jni.h>
#include "iitd_csd99440_ws5_PrimeSOAPBindingImpl.h"
#include <math.h>


#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT jboolean JNICALL Java_iitd_csd99440_ws5_PrimeSOAPBindingImpl_is_1prime
(JNIEnv *env, jobject job, jint jx) {


    int jxRoot2 = (int)(sqrt(jx));
    for (int i = 2; i <= jxRoot2; ++ i) {
        if ((jx % i) == 0)
            return false;
    }

    return true;
}

#ifdef __cplusplus
}
#endif
----------------------------------------

After this I compiled the program with the command

g++ -lm -shared checkPrime.cpp -o libMyPrime.so

Then I placed the shared object file in $HOME/lib, this directory is present in my LD_LIBRARY_PATH.

At this point I expected the service to work. But, it isn't working. When I click on the link "View the list of deployed web services", I get a blank page.

Can anybody tell me what's happening here ? I am sure the problem is simple : Either Axis or Tomcat isn't picking up the shared library. What else I have to do to make this thing running ?

thanks,
Deepak S Patwardhan.

Reply via email to