Skip to Main Content

Java HotSpot Virtual Machine

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Using JNI to call ONCRPC Client?

843829Nov 5 2009 — edited Nov 5 2009
I 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????
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Dec 3 2009
Added on Nov 5 2009
6 comments
190 views