K
kevin
Good Day,
I have a strange behavior starting a Java VM from a C side test program.
On Redhat 9.0, my test program works fine and runs my Java GUI. On
Slackware 9.0 the same code hangs on the JNI_CreateJavaVM. If you look
at the process list you find that 5 - 10 processes with my application
name have been started (at the same time). I have tried to make sure
everything is the exactly same for both distributions. I am using the
same installation of the JDK from Sun NetBeans, my user environment is
the same, My kernel configuration is the same and I am using the same
hardware by swapping IDE drives.
In ideas why and how this can happen and why my app is being spawned
over and over?
#include<jni.h>
#include"NativeCanvas.h"
#include<iostream>
unsigned int *dbuffer;
int main() {
JNIEnv *env;
JavaVM *jvm;
JavaVMInitArgs vm_args;
JavaVMOption options[1];
jint res;
jclass cls;
jclass cls2;
jmethodID mid;
jstring jstr;
jobjectArray args;
char classpath[1024];
jint error;
vm_args.version=JNI_VERSION_1_2;
// error = JNI_GetDefaultJavaVMInitArgs(&vm_args);
// printf("vm_args = %d\n",error);
//function pointers int (*pt2Function) (float, char, char);
void (*ptInit) (JNIEnv *, jobject, jint, jint);
void (*ptPaint) (JNIEnv *, jobject);
vm_args.nOptions=1;
options[0].optionString = "-Djava.class.path=.";
vm_args.options=options;
vm_args.ignoreUnrecognized=JNI_FALSE;
printf("env= %d\n",env);
res = JNI_CreateJavaVM(&jvm,(void**) &env, &vm_args);
if(res < 0){
fprintf(stderr,"Can't create JavaVM\n");
exit(1);
}
printf("env= %d\n",env);
ptInit = &Java_NativeCanvas_initNative;
ptPaint = &Java_NativeCanvas_paintNative;
printf("ptIint = %d, ptPaint = %d \n",ptInit,ptPaint);
JNINativeMethod methods[] = {
{"initNative","(II)V",(void *)ptInit},
{"paintNative","()V",(void *)ptPaint}
};
printf("cls= %d\n",cls);
cls = env->FindClass("GuiFrame");
printf("cls= %d\n",cls);
if(cls == 0){
fprintf(stderr, "Can't find class\n");
exit(1);
}
mid = env->GetStaticMethodID(cls, "main" ,"([Ljava/lang/String
V");
if(mid == 0){
fprintf(stderr,"Can't find testmain.main\n");
exit(1);
}
jstr=env->NewStringUTF("");
if(jstr == 0){
fprintf(stderr,"Out of memory\n");
exit(1);
}
args = env->NewObjectArray(0,env->FindClass("java/lang/String"),jstr);
if(args == 0){
fprintf(stderr,"Out of memory\n");
exit(1);
}
printf("cls= %d\n",cls);
cls2 = env->FindClass("NativeCanvas");
printf("cls2= %d\n",cls2);
if(cls2 == 0){
fprintf(stderr, "Can't find class 2 \n");
exit(1);
}
int reg = env->RegisterNatives(cls2,methods,2);
if(reg != 0)
{
printf("error Native Reg %d\n",reg);
exit(1);
}
env->CallStaticVoidMethod(cls,mid,args);
jvm->DestroyJavaVM();
}
I have a strange behavior starting a Java VM from a C side test program.
On Redhat 9.0, my test program works fine and runs my Java GUI. On
Slackware 9.0 the same code hangs on the JNI_CreateJavaVM. If you look
at the process list you find that 5 - 10 processes with my application
name have been started (at the same time). I have tried to make sure
everything is the exactly same for both distributions. I am using the
same installation of the JDK from Sun NetBeans, my user environment is
the same, My kernel configuration is the same and I am using the same
hardware by swapping IDE drives.
In ideas why and how this can happen and why my app is being spawned
over and over?
#include<jni.h>
#include"NativeCanvas.h"
#include<iostream>
unsigned int *dbuffer;
int main() {
JNIEnv *env;
JavaVM *jvm;
JavaVMInitArgs vm_args;
JavaVMOption options[1];
jint res;
jclass cls;
jclass cls2;
jmethodID mid;
jstring jstr;
jobjectArray args;
char classpath[1024];
jint error;
vm_args.version=JNI_VERSION_1_2;
// error = JNI_GetDefaultJavaVMInitArgs(&vm_args);
// printf("vm_args = %d\n",error);
//function pointers int (*pt2Function) (float, char, char);
void (*ptInit) (JNIEnv *, jobject, jint, jint);
void (*ptPaint) (JNIEnv *, jobject);
vm_args.nOptions=1;
options[0].optionString = "-Djava.class.path=.";
vm_args.options=options;
vm_args.ignoreUnrecognized=JNI_FALSE;
printf("env= %d\n",env);
res = JNI_CreateJavaVM(&jvm,(void**) &env, &vm_args);
if(res < 0){
fprintf(stderr,"Can't create JavaVM\n");
exit(1);
}
printf("env= %d\n",env);
ptInit = &Java_NativeCanvas_initNative;
ptPaint = &Java_NativeCanvas_paintNative;
printf("ptIint = %d, ptPaint = %d \n",ptInit,ptPaint);
JNINativeMethod methods[] = {
{"initNative","(II)V",(void *)ptInit},
{"paintNative","()V",(void *)ptPaint}
};
printf("cls= %d\n",cls);
cls = env->FindClass("GuiFrame");
printf("cls= %d\n",cls);
if(cls == 0){
fprintf(stderr, "Can't find class\n");
exit(1);
}
mid = env->GetStaticMethodID(cls, "main" ,"([Ljava/lang/String
if(mid == 0){
fprintf(stderr,"Can't find testmain.main\n");
exit(1);
}
jstr=env->NewStringUTF("");
if(jstr == 0){
fprintf(stderr,"Out of memory\n");
exit(1);
}
args = env->NewObjectArray(0,env->FindClass("java/lang/String"),jstr);
if(args == 0){
fprintf(stderr,"Out of memory\n");
exit(1);
}
printf("cls= %d\n",cls);
cls2 = env->FindClass("NativeCanvas");
printf("cls2= %d\n",cls2);
if(cls2 == 0){
fprintf(stderr, "Can't find class 2 \n");
exit(1);
}
int reg = env->RegisterNatives(cls2,methods,2);
if(reg != 0)
{
printf("error Native Reg %d\n",reg);
exit(1);
}
env->CallStaticVoidMethod(cls,mid,args);
jvm->DestroyJavaVM();
}