146 lines · 3.5 KB · C
RawDownload
#include <jni.h>#include <u.h>#include <libc.h>#include <draw.h>#include <string.h> void absmousetrack(int, int, int, ulong);ulong ticks(void);int dt_main(int, char**);int screenWidth = 800;int screenHeight = 1232;Point mousept = {0, 0};int buttons = 0;unsigned char* screenData();float ws = 1;float hs = 1;extern char *snarfbuf;int mPaused = 0; JNIEXPORT void JNICALLJava_org_echoline_drawterm_MainActivity_setPass(        JNIEnv *env,        jobject obj,        jstring str) {    setenv("PASS", (char*)(*env)->GetStringUTFChars(env, str, 0), 1);} JNIEXPORT void JNICALLJava_org_echoline_drawterm_MainActivity_setWidth(        JNIEnv *env,        jobject obj,        jint width) {    screenWidth = width;} JNIEXPORT void JNICALLJava_org_echoline_drawterm_MainActivity_setHeight(        JNIEnv *env,        jobject obj,        jint height) {    screenHeight = height;} JNIEXPORT void JNICALLJava_org_echoline_drawterm_MainActivity_setWidthScale(        JNIEnv *env,        jobject obj,        jfloat s) {    ws = s;} JNIEXPORT void JNICALLJava_org_echoline_drawterm_MainActivity_setHeightScale(        JNIEnv *env,        jobject obj,        jfloat s) {    hs = s;} JNIEXPORT jbyteArray JNICALLJava_org_echoline_drawterm_MainActivity_getScreenData(        JNIEnv *env,        jobject obj) {    jbyteArray buf = (*env)->NewByteArray(env, screenHeight * screenWidth * 4);    (*env)->SetByteArrayRegion(env, buf, 0, screenWidth * screenHeight * 4, (jbyte*)screenData());    return buf;} JNIEXPORT jint JNICALLJava_org_echoline_drawterm_MainActivity_dtmain(        JNIEnv *env,        jobject obj,        jobjectArray argv) {    int i, ret;    jboolean isCopy;    char **args = (char **) malloc(((*env)->GetArrayLength(env, argv)+1) * sizeof(char *));     for (i = 0; i < (*env)->GetArrayLength(env, argv); i++) {        jobject str = (jobject) (*env)->GetObjectArrayElement(env, argv, i);        args[i] = strdup((char*)(*env)->GetStringUTFChars(env, (jstring)str, 0));    }    args[(*env)->GetArrayLength(env, argv)] = NULL;     ret = dt_main(i, args);     for (i = 0; args[i] != NULL; i++) {        free(args[i]);    }    free(args);     return ret;} JNIEXPORT void JNICALLJava_org_echoline_drawterm_MainActivity_setMouse(        JNIEnv *env,        jobject obj,        jintArray args) {    jboolean isCopy;    jint *data;    if ((*env)->GetArrayLength(env, args) < 3)        return;    data = (*env)->GetIntArrayElements(env, args, &isCopy);    mousept.x = (int)(data[0] / ws);    mousept.y = (int)(data[1] / hs);    buttons = data[2];    (*env)->ReleaseIntArrayElements(env, args, data, 0);    absmousetrack(mousept.x, mousept.y, buttons, ticks());} JNIEXPORT jstring JNICALLJava_org_echoline_drawterm_MainActivity_getSnarf(        JNIEnv *env,        jobject obj) {    jstring ret = NULL;    if (snarfbuf != NULL) {        ret = (*env)->NewStringUTF(env, snarfbuf);    } else {        ret = (*env)->NewStringUTF(env, "");    }    return ret;} JNIEXPORT void JNICALLJava_org_echoline_drawterm_MainActivity_setSnarf(        JNIEnv *env,        jobject obj,        jstring str) {    if (snarfbuf != NULL)        free(snarfbuf);    snarfbuf = strdup((*env)->GetStringUTFChars(env, str, 0));} JNIEXPORT void JNICALLJava_org_echoline_drawterm_MainActivity_pauseDT(        JNIEnv *env,        jobject obj) {    mPaused = 1;} JNIEXPORT void JNICALLJava_org_echoline_drawterm_MainActivity_resumeDT(        JNIEnv *env,        jobject obj) {    mPaused = 0;}