Change RTLD_LAZY to RTLD_NOW and I think it will work. There was a bug
filed at Sun about something similar to this, and if I recall correctly,
the fix was to use RTLD_NOW.
--Jeff
[EMAIL PROTECTED] wrote:
>
> Hi Nathan,
>
> Thank you for your response. Please let me re-address my question by using
> the following pseudo code. I embedded my question in so2.c pseudo code.
>
> The following lines are app.java, so1.c and so2.c. They are only pseudo
> code.
>
> ======================================
> //app.java
> public class app
> {
> static
> {
> System.loadLibrary("so1");
> }
> native void so1Func();
>
> public static void main(String args[])
> {
> app myApp = new app();
> myApp.so1Func();
> }
>
> javaFunc()
> {
> System.out.printfln("In Java, called back from so1.so");
> }
>
> }
> ======================================
> //so1.c for libso1.so
> JNIEnv gEnv;
> jobject gObj;
>
> void Java_app_so1Func(JNIEnv * jEnv, jobject _this)
> {
> gEnv = jEnv;
> gObj = _this;
> ...
> library = dlopen("./libso2.so", RTLD_LAZY);
> funcRef = dlsym(library, "so2Func");
> (*funcRef)(); //call function so2Func() in libso2.so
> ...
> }
>
> void callBack()
> {
> jclass cls = (*gEnv)->GetObjectClass(gEnv, gObj);
> jmethodID mid = (*gEnv)->GetMethodID(gEnv, cls, "javaFunc", "(V)V");
> (*gEnv)->CallVoidMethod(gEnv, gObj, mid); //call back to java app.
> }
> ======================================
> //so2.c for libso2.so
> so2Func()
> {
> while(1)
> {
> ...
> //********************************
> //how to call back to the function
> //callBack() in libso1.so from here?
> //********************************
> ...
> }
> }
>
> app.java loads libso1.so into its address space, and libso1.so loads
> libso2.so into the same address space. So, libso2.so should be able to call
> a function in libso1.so (in the same address space) if libso2.so can resolve
> that function's symbol, but how?
>
> Thanks.
>
> Lee
>
> -----Original Message-----
> From: Nathan Meyers [mailto:[EMAIL PROTECTED]]
> Sent: Wednesday, February 02, 2000 10:44 PM
> To: [EMAIL PROTECTED]
> Cc: [EMAIL PROTECTED]
> Subject: Re: JNI & .so Files
>
> [EMAIL PROTECTED] wrote:
> >
> > Hi,
> >
> > I got a question on JNI. It would be appreciated if someone could help.
>
> Lee,
>
> I'm having trouble understanding the problem you're posing. What is the
> difficulty you're trying to solve... how to call functions in one .so
> from another .so? You're already doing that.
>
> Is it the problem of figuring out how to call a function whose name you
> do not know until runtime? If so, I think you'll find the
> dlopen()/dlsym()/dlclose() functions useful. Other than that
> possibility, I'm not quite sure what problem you're trying to solve.
>
> Nathan
>
> >
> > Q:
> > In order to hide java and jni related issues (e.g. jni function name
> > convention, etc.) from .so programmers, a wrapper .so file so1.so is used
> in
> > between java app and another .so file so2.so (the one with native
> functions
> > we need). This way, the java app interacts with the wrapper so1.so
> > directly. Every time when java app needs a native function service in
> > so2.so, it first calls a native function in so1.so through jni. so1.so,
> in
> > turn, calls the required function in so2.so. Everything works fine in
> this
> > direction (i.e. java app->so1.so->so2.so. java app loads so1.so, and
> so1.so
> > loads so2.so, then java app invokes a function in so2.so through a
> function
> > in so1.so). The question is how a function in so2.so calls back to java
> app
> > through a function in so1.so? In fact, we only need to know how functions
> > in so2.so can call functions in so1.so because jni will let us call back
> to
> > java app from so1.so.
> >
> > More information:
> > - the java app is multithreaded application using Thread.start().
> > - each java thread may call the same function in so1.so, then
> > this function, in turn, calls a function in so2.so
> > - native code doesn't create any thread.
> >
> > Use IPC? which one is easier on Linux? Is there any other mechanism
> > for this on Linux?
> >
> > A simple sample code will help a lot.
> >
> > Thank you.
> >
> > Lee
> >
> > ----------------------------------------------------------------------
> > To UNSUBSCRIBE, email to [EMAIL PROTECTED]
> > with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]
--
Jeff Galyan
http://www.anamorphic.com
http://www.sun.com
jeffrey dot galyan at sun dot com
talisman at anamorphic dot com
Sun Certified Java(TM) Programmer
======================================================================
Linus Torvalds on Microsoft and software development:
"... if it's a hobby for me and a job for you, why are you doing such a
shoddy job of it?"
The views expressed herein do not necessarily reflect those of my
employer.
Sun Microsystems, Inc., has no connection to my involvement with the
Mozilla Organization.
----------------------------------------------------------------------
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]