Unrue
18-12-2006, 11:34
Sto cercando di costruire un Web Services che richiama un metodo Java che a sua volta richiama un metodo C mediante JNI. Il fatto è che il metodo c non viene richiamato e non viene restituito alcun errore. Premetto che nel codice C non c'è nessun errore in quanto se provo a richiamarlo da una semplice classe Java funziona perfettamente, Dunque,io creo la classe TestJNI.java, che contiene il metodo nativo:
package provajni;
import java.lang.String;
public class TestJNI {
public native void metodoc(String firstarg,String secarg);
}
Qua ci andrebbe anche la System.loadLibrary, ho provato a metterla li,ma non succede nulla. Quindi la inserisco nella classe client,tanto credo sia lo stesso, basta che da qualche parte la carichi.
A questo punto compilo la classe e ,dal lato C creo l'header con javah e la libreria dinamica.
Adesso dal lato Java creo il WSDL:
java org.apache.axis.wsdl.Java2WSDL -o TestJNI.wsdl -l"http://localhost:8080/axis/services/TestJNI" -n "urn:TestJNI" -p"provajni" "urn: TestJNI " provajni.TestJNI
Poi i vari files per il WS:
java org.apache.axis.wsdl.WSDL2Java -o . -s -S true -Nurn:TestJNI provajni TestJNI.wsdl
Li compilo tutti e li copio sotto Tomcat. In seguito faccio il deploy del ws. Il WSDL di TestJNi quindi appare correttamente sotto i servizi di Axis ed espone il metodo "metodoc".
A questo punto creo la classe client:
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
//import java.lang.*;
public class ClasseProva
{
public ClasseProva()
{
}
public static void main(String [] args) throws Exception {
String endpoint = "http://localhost:8080/axis/services/TestJNI";
String method = "metodoc" ;
try{
System.loadLibrary("metodoc");
}
catch(UnsatisfiedLinkError e)
{e.printStackTrace();
}
}
Service service = new Service(); //creo un nuovo servizio
Call call = (Call)service.createCall();
call.setTargetEndpointAddress(new java.net.URL(endpoint));
call.setOperationName(method); // Definisco il metodo da invocare
call.invoke( new Object [] {"2","Funzionaaaaa!!!! :) :) "});
System.out.println("Ciao ciao");
}
}
LA libreria c la carica correttamente, viene scritta l'ultima stringa, ma il programma C non viene chiamato. Secondo me , il problema potrebbe essere che quando creo i vari files del WS, il metodo nativo, non viene visto come nativo, ovvero viene visto come void metodoc e non native void metodoc
Ringrazio chiunque mi aiuti :)
package provajni;
import java.lang.String;
public class TestJNI {
public native void metodoc(String firstarg,String secarg);
}
Qua ci andrebbe anche la System.loadLibrary, ho provato a metterla li,ma non succede nulla. Quindi la inserisco nella classe client,tanto credo sia lo stesso, basta che da qualche parte la carichi.
A questo punto compilo la classe e ,dal lato C creo l'header con javah e la libreria dinamica.
Adesso dal lato Java creo il WSDL:
java org.apache.axis.wsdl.Java2WSDL -o TestJNI.wsdl -l"http://localhost:8080/axis/services/TestJNI" -n "urn:TestJNI" -p"provajni" "urn: TestJNI " provajni.TestJNI
Poi i vari files per il WS:
java org.apache.axis.wsdl.WSDL2Java -o . -s -S true -Nurn:TestJNI provajni TestJNI.wsdl
Li compilo tutti e li copio sotto Tomcat. In seguito faccio il deploy del ws. Il WSDL di TestJNi quindi appare correttamente sotto i servizi di Axis ed espone il metodo "metodoc".
A questo punto creo la classe client:
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
//import java.lang.*;
public class ClasseProva
{
public ClasseProva()
{
}
public static void main(String [] args) throws Exception {
String endpoint = "http://localhost:8080/axis/services/TestJNI";
String method = "metodoc" ;
try{
System.loadLibrary("metodoc");
}
catch(UnsatisfiedLinkError e)
{e.printStackTrace();
}
}
Service service = new Service(); //creo un nuovo servizio
Call call = (Call)service.createCall();
call.setTargetEndpointAddress(new java.net.URL(endpoint));
call.setOperationName(method); // Definisco il metodo da invocare
call.invoke( new Object [] {"2","Funzionaaaaa!!!! :) :) "});
System.out.println("Ciao ciao");
}
}
LA libreria c la carica correttamente, viene scritta l'ultima stringa, ma il programma C non viene chiamato. Secondo me , il problema potrebbe essere che quando creo i vari files del WS, il metodo nativo, non viene visto come nativo, ovvero viene visto come void metodoc e non native void metodoc
Ringrazio chiunque mi aiuti :)