Date: Wed, 15 Mar 2000 14:07:31 -0700 (MST) From: Chad David <davidc@acns.ab.ca> To: Keith Wong <keith@1connect.com> Cc: freebsd-java <freebsd-java@FreeBSD.ORG> Subject: Re: JNI and Shared Library Message-ID: <Pine.BSF.4.21.0003151357100.34452-100000@lodge.guild.ab.ca> In-Reply-To: <38CAAFC3.FE74A64D@1connect.com>
next in thread | previous in thread | raw e-mail | index | archive | help
I do not completely understand all that you have said, but hopefully this
will help (it may be more than you asked for):
Step 1) Java source
public class Beep {
public static native void beep(int count);
}
static {
System.loadLibrary("beep");
}
public static void main(String args[]) {
beep(4);
}
}
Step 2) Compile the class and generate header
javac Beep.java
javah -jni Beep.class
Step 3) C Source
include <stdio.h>
include <unistd.h>
#include "Beep.h" /* generated file */
JNIEXPORT void JNICALL
Beep_beep(JNIEnv *e, jclass c, jint count) {
int i = (int)count;
for ( ; i > 0; i--) {
printf("%c", 7);
fflush(stdout);
usleep(300000);
}
return;
}
Step 4) Compile and link that C code
cc -Wall -c beep.c -I(the paths for your env)
ld -Bshareable -fPIC -o libbeep.so beep.o
Step 5) Set your LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD
Step 6) Run the program
java Beep
I hope this helps (and I didn't miss anything).
Chad
On Sat, 11 Mar 2000, Keith Wong wrote:
> Hi Folks,
> I have project that we are intended to use JNI to wrap the C native
> Code, so I can call java instead of the C. But, we have problem after we
>
> try to link the imdsi.o to libimdsi.so (Freebsd gcc environment). Then
> we are not even run this InsideLine.class. I have compared solaris's cc
> compiler and gcc compiler, i see some difference on the linker option,
> but i know i am get wrong on the linker shared library is it I pick the
> right one.
>
> Those are the some reference of how to compile the shared library.
> Here is the example of how to compile the shared library in Solaris and
> Win32:
> http://web2.java.sun.com/docs/books/tutorial/native1.1/stepbystep/step5.html
>
> In Solaris the way to get shared library:
> cc -G -I/usr/local/java/include -I/usr/local/java/include/solaris \
> HelloWorldImp.c -o libhello.so
> Here is the defination -G in Solaris's cc compiler:
> -G in Solaris is:
> Passes the option to the link editor to produce a shared object rather
> than a dynamically linked executable. This option is passed to ld(1),
> and cannot be used with the -dn option.
> http://docs.sun.com/ab2/coll.33.5/CUG/@Ab2PageView/2194?Ab2Lang=C&Ab2Enc=iso-8859-1
>
> Here is the gcc in the freebsd's linker's option:
> http://gcc.gnu.org/onlinedocs/gcc_2.html#SEC13
>
> ------------------------------------------------------------------------------------------------------
>
> Those are how we link the shared library in gcc
> % gcc -shared -I/usr/local/jdk1.1.8/include
> -I/usr/local/jdk1.1.8/include/freebsd
> -I/usr/home/eproj/codebase/com/ingram
> -I/usr/home/eproj/codebase/com/ingram/hw_appl.h -I/usr/include/rpc/rpc.h
> -I/usr/home/eproj/codebase/com/ingram/com_ingram_InsideLine.h
> InsideLine.c -fPIC -o libimdsi.so
>
> InsideLine.c: In function `Java_InsideLine_Call_1Server':
> InsideLine.c:52: warning: cast to pointer from integer of different size
>
> InsideLine.c: In function `Java_InsideLine_Close_1Client':
> InsideLine.c:74: warning: cast to pointer from integer of different size
>
> InsideLine.c: In function `Java_InsideLine_Open_1Client':
> InsideLine.c:87: warning: cast from pointer to integer of different size
>
> Then, i try to run the test program.
> % java com.ingram.InsideLine
> java.lang.UnsatisfiedLinkError: Open_Client
> at com.ingram.InsideLine.main(InsideLine.java:23)
>
> % file libimdsi.so
> libimdsi.so: ELF 32-bit LSB shared object, Intel 80386, version 1
> (FreeBSD), not stripped
>
> >From the output about, i think the libimdsi.so have not linked with the
>
> Call_Server function. Do you have any ideal how to make that imdsi.o's
> three functions linked into the libimdsi.so. I had made full path for
> java in FreeBSD enirovnment
> setenv LD_LIBRARY_PATH
> .:/usr/home/eproj/codebase/com/ingram:/usr/home/eproj/codebase
> setenv CLASSPATH
> /usr/local/mm.mysql.jdbc-2.0pre3:/usr/local/share/java/classes/jsdk.jar:/usr/home/eproj/codebase
>
> Other, i have the Helloworld.java and .c (from sun website). i can
> compile it and run with no problem,
> yes, i know the the Helloworld.c is wrote by us. is that a problem that
> becuase i import the .object instead of .c file,
> do we have any way to link the .object file?? Is that i am using the gcc
> -shared in the correct way?
>
>
> Thanks a million!
>
> Keith.
>
>
>
>
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-java" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.21.0003151357100.34452-100000>
