M
Maki
Could you help me on this...
Why is the following two calls returning "NULL" when called from JNI.I
tried lot of ways but failed to reslove the issue.
Thread.currentThread().getContextClassLoader(),
getClass().getClassLoader().
/>./a.out
Main-Class:class Test
Thread:Thread[main,5,main]
Thread-current-Thread:null
Main-ClassLoader:null
But,when I call Test.class file from java("java Test") its working
fine...!!!!
Main-Class:class Test
Thread:Thread[main,5,main]
Thread-current-Thread:sun.misc.Launcher$AppClassLoader@1d10ed
Main-ClassLoader:sun.misc.Launcher$AppClassLoader@1d10ed
Please find here the programs
*****************How to compile******************
#javac Test.java
#/usr/local/bin/gcc -I /usr/java1.2/include -I
/usr/java1.2/include/solaris -L/usr/java1.2/jre/lib/sparc -ljava
-ljvm invoke.c
#export LD_LIBRARY_PATH=/usr/java1.2/jre/lib/sparc
************************End of Compile******************
My java Programe is
***************************Test.java***************************
import java.io.InputStream;
import java.net.URL;
public class Test{
public static void main(String[ ] args){
try{
Test c = new Test();
System.out.println("Main-Class:"+c.getClass());
System.out.println("Thread:"+Thread.currentThread());
System.out.println("Thread-current-Thread:"+Thread.currentThread().getContextClassLoader());
System.out.println("Main-ClassLoader:"+c.getClass().getClassLoader());
}
catch(Exception e)
{
System.out.println("Error\n"+e);
e.printStackTrace();
}
}
}
******************************************End of
Test.java*********************
******************************************invoke.c****************************
#include <jni.h>
#ifdef _WIN32
#define PATH_SEPARATOR ';'
#else /* UNIX */
#define PATH_SEPARATOR ':'
#endif
#define USER_CLASSPATH "." /* where Prog.class is */
main() {
JNIEnv *env;
JavaVM *jvm;
JDK1_1InitArgs vm_args;
jint res;
jclass cls;
jmethodID mid;
jstring jstr;
jobjectArray args;
char classpath[1024];
jthrowable exc;
/* 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;
//JNI_CreateJavaVM(JavaVM **pvm, void **penv, void *args);
/* Create the Java VM */
res = JNI_CreateJavaVM(&jvm,&env,&vm_args);
if (res < 0) {
fprintf(stderr, "Can't create Java VM\n");
exit(1);
}
cls = (*env)->FindClass(env, "Test");
if (cls == 0) {
fprintf(stderr, "Can't find Prog class\n");
exit(1);
}
mid = (*env)->GetStaticMethodID(env, cls, "main",
"([Ljava/lang/StringV");
if (mid == 0) {
fprintf(stderr, "Can't find Prog.main\n");
exit(1);
}
jstr = (*env)->NewStringUTF(env, " from C!");
if (jstr == 0) {
fprintf(stderr, "Out of memory\n");
exit(1);
}
args = (*env)->NewObjectArray(env, 1,
(*env)->FindClass(env,
"java/lang/String"), jstr);
if (args == 0) {
fprintf(stderr, "Out of memory\n");
exit(1);
}
(*env)->CallStaticVoidMethod(env, cls, mid, args);
exc = (*env)->ExceptionOccurred(env);
if(exc)
{
(*env)->ExceptionDescribe(env);
(*env)->ExceptionClear(env);
printf("Sorry Failed in adding user\n");
}
(*jvm)->DestroyJavaVM(jvm);
}
***************************************End of
invoke.c************************************
Thanks,
Ranga
Why is the following two calls returning "NULL" when called from JNI.I
tried lot of ways but failed to reslove the issue.
Thread.currentThread().getContextClassLoader(),
getClass().getClassLoader().
/>./a.out
Main-Class:class Test
Thread:Thread[main,5,main]
Thread-current-Thread:null
Main-ClassLoader:null
But,when I call Test.class file from java("java Test") its working
fine...!!!!
Main-Class:class Test
Thread:Thread[main,5,main]
Thread-current-Thread:sun.misc.Launcher$AppClassLoader@1d10ed
Main-ClassLoader:sun.misc.Launcher$AppClassLoader@1d10ed
Please find here the programs
*****************How to compile******************
#javac Test.java
#/usr/local/bin/gcc -I /usr/java1.2/include -I
/usr/java1.2/include/solaris -L/usr/java1.2/jre/lib/sparc -ljava
-ljvm invoke.c
#export LD_LIBRARY_PATH=/usr/java1.2/jre/lib/sparc
************************End of Compile******************
My java Programe is
***************************Test.java***************************
import java.io.InputStream;
import java.net.URL;
public class Test{
public static void main(String[ ] args){
try{
Test c = new Test();
System.out.println("Main-Class:"+c.getClass());
System.out.println("Thread:"+Thread.currentThread());
System.out.println("Thread-current-Thread:"+Thread.currentThread().getContextClassLoader());
System.out.println("Main-ClassLoader:"+c.getClass().getClassLoader());
}
catch(Exception e)
{
System.out.println("Error\n"+e);
e.printStackTrace();
}
}
}
******************************************End of
Test.java*********************
******************************************invoke.c****************************
#include <jni.h>
#ifdef _WIN32
#define PATH_SEPARATOR ';'
#else /* UNIX */
#define PATH_SEPARATOR ':'
#endif
#define USER_CLASSPATH "." /* where Prog.class is */
main() {
JNIEnv *env;
JavaVM *jvm;
JDK1_1InitArgs vm_args;
jint res;
jclass cls;
jmethodID mid;
jstring jstr;
jobjectArray args;
char classpath[1024];
jthrowable exc;
/* 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;
//JNI_CreateJavaVM(JavaVM **pvm, void **penv, void *args);
/* Create the Java VM */
res = JNI_CreateJavaVM(&jvm,&env,&vm_args);
if (res < 0) {
fprintf(stderr, "Can't create Java VM\n");
exit(1);
}
cls = (*env)->FindClass(env, "Test");
if (cls == 0) {
fprintf(stderr, "Can't find Prog class\n");
exit(1);
}
mid = (*env)->GetStaticMethodID(env, cls, "main",
"([Ljava/lang/StringV");
if (mid == 0) {
fprintf(stderr, "Can't find Prog.main\n");
exit(1);
}
jstr = (*env)->NewStringUTF(env, " from C!");
if (jstr == 0) {
fprintf(stderr, "Out of memory\n");
exit(1);
}
args = (*env)->NewObjectArray(env, 1,
(*env)->FindClass(env,
"java/lang/String"), jstr);
if (args == 0) {
fprintf(stderr, "Out of memory\n");
exit(1);
}
(*env)->CallStaticVoidMethod(env, cls, mid, args);
exc = (*env)->ExceptionOccurred(env);
if(exc)
{
(*env)->ExceptionDescribe(env);
(*env)->ExceptionClear(env);
printf("Sorry Failed in adding user\n");
}
(*jvm)->DestroyJavaVM(jvm);
}
***************************************End of
invoke.c************************************
Thanks,
Ranga