Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
void* android_opengl_get_surface(jobject surface)
{
    JNIEnv *env = 0;
    get_jvm(&env);
    return ((env && surface)? ANativeWindow_fromSurface(env, surface): NULL);
}