CLASS *java_init(CALLBACKS *fntable, JAVACALLBACKS *jfntable, MODULE *module, char *modulename, int argc, char *argv[]) { JavaVM *jvm = NULL; JNIEnv *jnienv = NULL; if (!set_callback(fntable)) { errno = EINVAL; return NULL; } JAVACALLBACKS *jcallback = jfntable; if(jcallback == NULL) { gl_error("%s:java_init() - unable to find jcallback", modulename); return NULL; } if(jvm == NULL) jvm = get_jvm(); if(jnienv == NULL) jnienv = get_env(); jstring *jargv = new jstring[argc]; int i = 0; gl_output("javamod init entered\n"); jclass cls = jnienv->FindClass(modulename); if(cls == NULL) { gl_error("javamod:init.cpp: unable to find %s.class", modulename); return NULL; } jmethodID init_mid = jnienv->GetStaticMethodID(cls, "init", "(JLjava/lang/String;I[Ljava/lang/String;)J"); if(init_mid == NULL) { gl_error("javamod:init.cpp: unable to find \"int %s.init(long, string, int, string[])\"", modulename); return NULL; } jobjectArray args = jnienv->NewObjectArray(argc, jnienv->FindClass("[Ljava/lang/String;"), NULL); if(args == NULL) { gl_error("javamod:init.cpp: unable to allocate args[] for %s.init()", modulename); return NULL; } for(i = 0; i < argc; ++i) { jargv[i] = jnienv->NewStringUTF(argv[i]); jnienv->SetObjectArrayElement(args, i, jargv[i]); } jstring jmodname = jnienv->NewStringUTF(modulename); if(jmodname == NULL) { gl_error("javamod:init.cpp: unable to allocate jmodname for %s.init()", modulename); } gl_output("javamod:init.cpp(): moduleaddr = %x", module); int64 rv = jnienv->CallStaticLongMethod(cls, init_mid, (int64)module, jmodname, argc, jargv); if (jnienv->ExceptionOccurred()) { jnienv->ExceptionDescribe(); } // JNI cleanup jnienv->DeleteLocalRef(args); for(i = 0; i < argc; ++i) ; /* delete the strings */ gl_output("finished javamod init\n"); return (CLASS *)rv; }
void* android_opengl_get_surface(jobject surface) { JNIEnv *env = 0; get_jvm(&env); return ((env && surface)? ANativeWindow_fromSurface(env, surface): NULL); }