On Sun, Dec 19, 1999 at 10:10:01AM -0500, Jean-Pierre Fournier wrote:
>
>
> Hi,
>
> linux 2.0.38
> java 1.1.7B
>
>
> I am trying to get a handle to a remote
> object from C. In my C program, I create
> a VM, find the class I want, find the method
> and then call CallStaticIntMethod(). It
> appears that Naming.lookup() is the cause
> of my NoClassDefFoundError, since if I
> comment this line out in the java code
> things seem to work.
Is the classfile for the remote stub in your program's classpath?
Nathan
> Digging around on the JDC the only similar
> problem I found involved applets in browsers.
> In this case the conclusion was that the
> browser didn't support rmi.
>
> Does anyone know of any limitations on VMs
> created via JNI_CreateJavaVM()?
>
> I will append some code below, in case I am
> doing something obviously wrong.
>
> thanks,
>
> jp
>
>
> [jape@jaguar test2]$ pwd
> /home/jape/test2
> [jape@jaguar test2]$ echo $CLASSPATH
> /home/jape
> [jape@jaguar test2]$ echo $LD_LIBRARY_PATH
> /usr/local/java/lib/i386/native_threads/
> [jape@jaguar test2]$ cat Makefile
> ALL:
> javac *.java
> rmic test2.Server
>
> clean:
> rm *.class
>
> spawn: spawn_jvm.c
> cc -Wall -I/usr/local/java/include
> -I/usr/local/java/include/genunix -o
> spawn spawn_jvm.c -L/usr/local/java/lib/i386/native_threads/ -ljava
> [jape@jaguar test2]$ ./spawn
> classpath=
> /usr/local/java/lib/i386/native_threads//../../../classes:/usr/local/
> java/lib/i386/native_threads//../../classes.zip:/usr/local/java/lib/i386/native_
> threads//../../classes.jar:/usr/local/java/lib/i386/native_threads//../../rt.jar
> :/usr/local/java/lib/i386/native_threads//../../i18n.jar:/usr/home/jape
> before calling static method
> result is =0
> exception detected : after call static obj method
> java.lang.NoClassDefFoundError
>
>
>
> code:
>
>
> package test2;
>
> import java.rmi.*;
>
>
> public class Native {
> private static ServerInterface factory = null;
>
>
> private static ServerInterface getFactory() {
> if ( factory == null ) {
> if ( System.getSecurityManager() == null )
> System.setSecurityManager(new RMISecurityManager());
>
> try {
> factory = (ServerInterface)
> java.rmi.Naming.lookup( "rmi://localhost/Server" );
>
> } catch (Exception e ) {
> e.printStackTrace();
> }
>
> }
> return factory;
> }
>
> public static int create ( ) {
>
> try {
> ServerInterface result = getFactory();
>
> return 10 ;
>
> } catch (Exception e ) {
> e.printStackTrace();
> return 6;
> }
> }
>
>
> }
>
>
> #include <jni.h>
>
> #ifdef _WIN32
> #define PATH_SEPARATOR ';'
> #else /* UNIX */
> #define PATH_SEPARATOR ':'
> #endif
>
> #define USER_CLASSPATH "/usr/home/jape"
>
>
> void checkException( JNIEnv *env, char * string ) {
> jthrowable exp;
>
> exp = (*env)->ExceptionOccurred(env);
> if (exp) {
> fprintf( stderr, "exception detected : %s\n", string);
> (*env)->ExceptionDescribe(env);
> (*env)->ExceptionClear(env);
> }
>
>
> }
>
> int main() {
> JNIEnv *env;
> JavaVM *jvm;
> JDK1_1InitArgs vm_args;
> jint res;
> jclass cls;
>
> jmethodID mid;
> jobjectArray args;
> char classpath[1024];
> jobject visual;
> jthrowable exp;
> int result;
>
> /* IMPORTANT: specify vm_args version # if you use JDK1.1.2 and
> beyond */
> vm_args.version = 0x00010001;
>
> JNI_GetDefaultJavaVMInitArgs(&vm_args);
>
> /* Append USER_CLASSPATH to the end of default system class path */
> sprintf(classpath, "%s%c%s",
> vm_args.classpath, PATH_SEPARATOR, USER_CLASSPATH);
> vm_args.classpath = classpath;
>
> fprintf(stderr, "classpath= %s\n", vm_args.classpath);
>
> /* Create the Java VM */
> res = JNI_CreateJavaVM(&jvm,&env,&vm_args);
> if (res < 0) {
> fprintf(stderr, "Can't create Java VM\n");
> exit(1);
> }
> checkException ( env, "after create vm" );
>
> cls = (*env)->FindClass(env, "test2/Native");
> if (cls == 0) {
> fprintf(stderr, "Can't find Native class\n");
> exit(1);
> }
> checkException ( env, "after find class " );
>
> mid = (*env)->GetStaticMethodID(env, cls, "create", "()I");
> if (mid == 0) {
> fprintf(stderr, "Can't find ggi create\n");
> exit(1);
> }
> checkException ( env, "after get static method");
>
> args = 0;
>
> fprintf(stderr, "before calling static method\n" );
> result = (*env)->CallStaticIntMethod(env, cls, mid, args);
>
> fprintf(stderr, "result is =%d\n", result);
> checkException( env, "after call static obj method");
>
> (*jvm)->DestroyJavaVM(jvm);
>
> return 0;
>
> }
>
>
> ----------------------------------------------------------------------
> To UNSUBSCRIBE, email to [EMAIL PROTECTED]
> with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]
----------------------------------------------------------------------
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]