Re: JNI Programming
On Nov 7, 5:14 am, Gordon Beaton <n....@for.email> wrote:
On Tue, 06 Nov 2007 20:33:39 -0000, Bala wrote:
Sorry, this problem seems to be solved. I had the wrong name
mangling conversion in the JavaC.C file, which was causing the
problem.
This often indicates that you didn't exactly obey the method
signatures generated by javah, since javah already declares the
generated methods 'extern "C"' in the header file. For example if you
changed any of the argument datatypes the declaration no longer has
any effect.
Now my code executes, but dlopen failed due to some reason, will
check that. The other dynamic library libSubscribe.so could not be
loaded when i used dlopen to call it.
If libSubscribe.so has further dependencies (check with ldd) then the
dynamic linker needs to be able to find them at runtime or
libSubscribe.so itself will fail to load. Note that this depends on
the flags you pass to dlopen(), in particular RTLD_LAZY or RTLD_NOW.
The dependent libraries, unlike libSubscribe.so, must either be in
default locations (typically /lib and /usr/lib) or in one of the paths
mentioned in LD_LIBRARY_PATH.
/gordon
--
All the dependent libraries that libSubscribe.so is statically linked
and are all static c libraries.
Loading of libSubscribe.so is successful now, but after that the
Java's Main application tries to call the required native function, i
am getting an error which i have pasted below the source code.
This is how my source code looks like
Main.java - Executing Program
------------------------------
class Main {
public static void main (String Args[]) {
OpenApi openApi = new OpenApi();
openApi.OAPIInit ();
}
}
OpenApi.java - Used to generate OpenApi.h using javah
-----------------------------------------------------
class OpenApi {
public native void OAPIInit ();
static {
System.loadLibrary ("OpenApiImp");
}
}
JavaC.C - Used to create libOpenApiImp.so
------------------------------------------
#include "OpenApi.h"
#include "jni.h"
#include <Common.h>
#include <dlfcn.h>
#include <link.h>
JNIEXPORT void JNICALL Java_OpenApi_OAPIInit(JNIEnv *env, jobject obj)
{
if (!dlopen ("//home1//users//biyer//Bala//OAPI//src//
libSubscribe.so", RTLD_GLOBAL))
{
printf ("\n Library Loaded Successfully\n");
OAPI_main();
printf ("\n OAPI_Main Called\n");
}
else
printf ("\nError Loading the Dynamic Library\n");
}
Common.C - Used to generate libSubscribe.so
-------------------------------------------
void OAPI_main()
{
printf ("\nIn OAPI Main\n");
OAPI_Init();
strcpy (FirmName, "BRAS");
OAPI_PASSPORT *Passport = GetAPassport (FirmName);
OAPI_Logon (Passport);
OAPI_start();
SpecialRequest();
My_mainloop();
}
All the functions called by OPAI_main are functions inside the static
libraries which are linked to libSubscribe.so.
When i run Main.java, i get the error as i stated
java Main
Library Loaded Successfully
ld.so.1: java: fatal: relocation error: file /home1/users/biyer/Bala/
OAPI/src/libOpenApiImp.so: symbol _Z9OAPI_mainv: referenced symbol not
found
Killed
Any thoughts why this could be happening? Does this mean that the
static libraries havent got linked properly?
This is the command that i use to build both the shared libraries.
libOpenApiImp.so
----------------
g++ -fpic -Wl,-G -Wl,-dy -Wno-deprecated -D_REENTRANT -DSOLARIS -DSUN4
-DSUN -DSVR4 -D_POSIX_PTHREAD_SEMANTICS -I/usr/java/include -I/usr/
java/include/solaris
-I/home1/users/biyer/Bala/OAPI/include -I/home1/users/biyer/Bala/OAPI/
src JavaC.C /home1/users/biyer/Bala/OAPI/lib/libAdpt.a /home1/users/
biyer/Bala/OAPI/lib/libDef.a
/home1/users/biyer/Bala/OAPI/lib/libxAdpt.a -o libOpenApiImp.so
libSubscribe.so
---------------
g++ -fpic -Wl,-G -Wl,-dy -Wno-deprecated -D_REENTRANT -DSOLARIS -DSUN4
-DSUN -DSVR4
-D_POSIX_PTHREAD_SEMANTICS -I/usr/java/include -I/usr/java/include/
solaris
-I/home1/users/biyer/Bala/OAPI/include -I/home1/users/biyer/Bala/OAPI/
src Common.C /home1/users/biyer/Bala/OAPI/lib/libAdpt.a /home1/users/
biyer/Bala/OAPI/lib/libDef.a
/home1/users/biyer/Bala/OAPI/lib/libxAdpt.a -o libSubscribe.so