Using JNI to call ONCRPC Client?
843829Nov 5 2009 — edited Nov 5 2009I have made a C client and Server using ONCRPC with
C Client:::[Client.c]
#include <stdio.h>
#include "onc.h"
#include "Client.h"
#include "jawt.h"
#include "jni.h"
/* client localhost operation id serial*/
JNIEXPORT void JNICALL Java_Client_connectTo(JNIEnv *env,jobject obj,jstring msg,jint ide,jint ser)
{
CLIENT *clnt;
int *result;
char *server;
input_data message;
int len=0;
const char str = (env)->GetStringUTFChars(env, msg, 0);
server = "localhost";
message.operation =str;
message.id.id_val=(int*) malloc(MAXID*sizeof(int));
message.id.id_len=1;
message.id.id_val=&ide;
message.serial.serial_len=1;
message.serial.serial_val=(int*) malloc(MAXID*sizeof(int));
message.serial.serial_val=&ser;
printf("operation= %s",message.operation);
printf("\nid= %d",*message.id.id_val);
printf("\nserial= %d",*message.serial.serial_val);
clnt = clnt_create(server,ONCPROG,CONNECTVERS,"tcp");
printf("\nclnt= %s\n",clnt);
if (clnt == (CLIENT *)NULL) {
clnt_pcreateerror(server);
exit(1);
}
printf("test2\n");
result = onccall_1(&message,clnt);
printf("Result\n");
if (result == (int *)NULL) {
clnt_perror(clnt, server);
exit(1);
}
if (*result == 0) {
fprintf(stderr, "localhost: could not print your message\n");
exit(1);
}
printf("\nMessage delivered to %s\n", server);
clnt_destroy( clnt );
exit(0);
}
And Server as::[Server.c]
#include <stdio.h>
#include "onc.h"
#include "jawt.h"
int* onccall_1(input_data msg, CLIENT clnt)
{
printf("test server");
static int result;
FILE *f;
f = fopen("/users/JRDVCI/arvindm/sample/sampleClient/tp.txt", "w");
if (f == (FILE *)NULL) {
result = 0;
return (&result);
}
printf("Request received");
fprintf(f, "%s\n",msg->operation);
fprintf(f, "%d\n",msg->id.id_val);
fprintf(f, "%d\n",msg->serial.serial_val);
printf("\nResponse sent");
fclose(f);
result = 1;
return (&result);
}
int * onccall_1_svc(input_data input, struct svc_req svc) {
CLIENT *client;
printf("\nSERVER STARTED(waiting for request).......\n");
return(onccall_1(input,client));
}
My onc.x file used by RPCGEN is:
const MAXSTRING = 100;
const MAXID= 200;
struct input_data {
string operation<MAXSTRING>;
int id<MAXID>;
int serial<MAXID>;
};
typedef struct input_data input_data;
program ONCPROG {
version CONNECTVERS {
int ONCCALL(input_data) = 1;
} =1;
} = 0x20000001;
My JNI Client.java file is:::
class Client
{
public native void connectTo(String str,int id,int serial);
static
{
System.loadLibrary("client");
}
}
and Main.java is::::
class Main
{
public static void main(String[] args)
{
Client c1 = new Client();
c1.connectTo("Name",99,100);
}
}
And i have made my libClient.so by using::
$gcc -shared -fpic -o libclient.so Client.c
but when i execute my main after all compilation it gives::
$ java Main
operation= Name
id= 99
serial= 100
clnt= @:
test2
java: symbol lookup error:_ /users/JRDVCI/arvindm/sample/sampleClient/libclient.so: undefined symbol:_ onccall_1
Please suggest me where i am wrong in my code???
i think there is some mistake in linking library file... if yes how to solve it????