⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dispatch.c

📁 学习JAVA编程的示例
💻 C
📖 第 1 页 / 共 2 页
字号:
JNIEXPORT void JNICALL Java_CPtr_copyOut__I_3BII
  (JNIEnv *env, jobject self, jint boff, jbyteArray arr, jint off, jint n)
{
    jbyte *peer = (jbyte *)(*env)->GetLongField(env, self, CPtr_peer_ID);
    (*env)->SetByteArrayRegion(env, arr, off, n, peer + boff);
}

/*
 * Class:     CPtr
 * Method:    copyOut
 * Signature: (I[CII)V
 */
JNIEXPORT void JNICALL Java_CPtr_copyOut__I_3CII
  (JNIEnv *env, jobject self, jint boff, jcharArray arr, jint off, jint n)
{
    jchar *peer = (jchar *)(*env)->GetLongField(env, self, CPtr_peer_ID);
    (*env)->SetCharArrayRegion(env, arr, off, n, peer + boff);
}

/*
 * Class:     CPtr
 * Method:    copyOut
 * Signature: (I[DII)V
 */
JNIEXPORT void JNICALL Java_CPtr_copyOut__I_3DII
  (JNIEnv *env, jobject self, jint boff, jdoubleArray arr, jint off, jint n)
{
    jdouble *peer = (jdouble *)(*env)->GetLongField(env, self, CPtr_peer_ID);
    (*env)->SetDoubleArrayRegion(env, arr, off, n, peer + boff);
}

/*
 * Class:     CPtr
 * Method:    copyOut
 * Signature: (I[FII)V
 */
JNIEXPORT void JNICALL Java_CPtr_copyOut__I_3FII
  (JNIEnv *env, jobject self, jint boff, jfloatArray arr, jint off, jint n)
{
    jfloat *peer = (jfloat *)(*env)->GetLongField(env, self, CPtr_peer_ID);
    (*env)->SetFloatArrayRegion(env, arr, off, n, peer + boff);
}

/*
 * Class:     CPtr
 * Method:    copyOut
 * Signature: (I[III)V
 */
JNIEXPORT void JNICALL Java_CPtr_copyOut__I_3III
  (JNIEnv *env, jobject self, jint boff, jintArray arr, jint off, jint n)
{
    jint *peer = (jint *)(*env)->GetLongField(env, self, CPtr_peer_ID);
    (*env)->SetIntArrayRegion(env, arr, off, n, peer + boff);
}

/*
 * Class:     CPtr
 * Method:    copyOut
 * Signature: (I[JII)V
 */
JNIEXPORT void JNICALL Java_CPtr_copyOut__I_3JII
  (JNIEnv *env, jobject self, jint boff, jlongArray arr, jint off, jint n)
{
    jlong *peer = (jlong *)(*env)->GetLongField(env, self, CPtr_peer_ID);
    (*env)->SetLongArrayRegion(env, arr, off, n, peer + boff);
}

/*
 * Class:     CPtr
 * Method:    copyOut
 * Signature: (I[SII)V
 */
JNIEXPORT void JNICALL Java_CPtr_copyOut__I_3SII
  (JNIEnv *env, jobject self, jint boff, jshortArray arr, jint off, jint n)
{
    jshort *peer = (jshort *)(*env)->GetLongField(env, self, CPtr_peer_ID);
    (*env)->SetShortArrayRegion(env, arr, off, n, peer + boff);
}

/*
 * Class:     CPtr
 * Method:    getByte
 * Signature: (I)B
 */
JNIEXPORT jbyte JNICALL Java_CPtr_getByte
  (JNIEnv *env, jobject self, jint index)
{
    jbyte res;
    jbyte *peer = (jbyte *)(*env)->GetLongField(env, self, CPtr_peer_ID);
    memcpy(&res, peer + index, sizeof(res));
    return res;
}

/*
 * Class:     CPtr
 * Method:    getCPtr
 * Signature: (I)LCPtr;
 */
JNIEXPORT jobject JNICALL Java_CPtr_getCPtr
  (JNIEnv *env, jobject self, jint index)
{
    void *ptr;
    jbyte *peer = (jbyte *)(*env)->GetLongField(env, self, CPtr_peer_ID);
    memcpy(&ptr, peer + index, sizeof(ptr));
    return makeCPtr(env, ptr);
}

/*
 * Class:     CPtr
 * Method:    getDouble
 * Signature: (I)D
 */
JNIEXPORT jdouble JNICALL Java_CPtr_getDouble
  (JNIEnv *env, jobject self, jint index)
{
    jdouble res;
    jbyte *peer = (jbyte *)(*env)->GetLongField(env, self, CPtr_peer_ID);
    memcpy(&res, peer + index, sizeof(res));
    return res;
}

/*
 * Class:     CPtr
 * Method:    getFloat
 * Signature: (I)F
 */
JNIEXPORT jfloat JNICALL Java_CPtr_getFloat
  (JNIEnv *env, jobject self, jint index)
{
    jfloat res;
    jbyte *peer = (jbyte *)(*env)->GetLongField(env, self, CPtr_peer_ID);
    memcpy(&res, peer + index, sizeof(res));
    return res;
}

/*
 * Class:     CPtr
 * Method:    getInt
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_CPtr_getInt
  (JNIEnv *env, jobject self, jint index)
{
    jint res;
    jbyte *peer = (jbyte *)(*env)->GetLongField(env, self, CPtr_peer_ID);
    memcpy(&res, peer + index, sizeof(res));
    return res;
}

/*
 * Class:     CPtr
 * Method:    getLong
 * Signature: (I)J
 */
JNIEXPORT jlong JNICALL Java_CPtr_getLong
  (JNIEnv *env, jobject self, jint index)
{
    jlong res;
    jbyte *peer = (jbyte *)(*env)->GetLongField(env, self, CPtr_peer_ID);
    memcpy(&res, peer + index, sizeof(res));
    return res;
}

/*
 * Class:     CPtr
 * Method:    getShort
 * Signature: (I)S
 */
JNIEXPORT jshort JNICALL Java_CPtr_getShort
  (JNIEnv *env, jobject self, jint index)
{
    jshort res;
    jbyte *peer = (jbyte *)(*env)->GetLongField(env, self, CPtr_peer_ID);
    memcpy(&res, peer + index, sizeof(res));
    return res;
}

/*
 * Class:     CPtr
 * Method:    getString
 * Signature: (I)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_CPtr_getString
  (JNIEnv *env, jobject self, jint index)
{
    jbyte *peer = (jbyte *)(*env)->GetLongField(env, self, CPtr_peer_ID);
    return newJavaString(env, (const char *)peer + index);
}

/*
 * Class:     CPtr
 * Method:    setByte
 * Signature: (IB)V
 */
JNIEXPORT void JNICALL Java_CPtr_setByte
  (JNIEnv *env, jobject self, jint index, jbyte value)
{
    jbyte *peer = (jbyte *)(*env)->GetLongField(env, self, CPtr_peer_ID);
    memcpy(peer + index, &value, sizeof(value));
}

/*
 * Class:     CPtr
 * Method:    setCPtr
 * Signature: (ILCPtr;)V
 */
JNIEXPORT void JNICALL Java_CPtr_setCPtr
  (JNIEnv *env, jobject self, jint index, jobject cptr)
{
    void *ptr = (void *)(*env)->GetLongField(env, cptr, CPtr_peer_ID);
    jbyte *peer = (jbyte *)(*env)->GetLongField(env, self, CPtr_peer_ID);
    memcpy(peer + index, &ptr, sizeof(ptr));
}

/*
 * Class:     CPtr
 * Method:    setDouble
 * Signature: (ID)V
 */
JNIEXPORT void JNICALL Java_CPtr_setDouble
  (JNIEnv *env, jobject self, jint index, jdouble value)
{
    jbyte *peer = (jbyte *)(*env)->GetLongField(env, self, CPtr_peer_ID);
    memcpy(peer + index, &value, sizeof(value));
}

/*
 * Class:     CPtr
 * Method:    setFloat
 * Signature: (IF)V
 */
JNIEXPORT void JNICALL Java_CPtr_setFloat
  (JNIEnv *env, jobject self, jint index, jfloat value)
{
    jbyte *peer = (jbyte *)(*env)->GetLongField(env, self, CPtr_peer_ID);
    memcpy(peer + index, &value, sizeof(value));
}

/*
 * Class:     CPtr
 * Method:    setInt
 * Signature: (II)V
 */
JNIEXPORT void JNICALL Java_CPtr_setInt
  (JNIEnv *env, jobject self, jint index, jint value)
{
    jbyte *peer = (jbyte *)(*env)->GetLongField(env, self, CPtr_peer_ID);
    memcpy(peer + index, &value, sizeof(value));
}

/*
 * Class:     CPtr
 * Method:    setLong
 * Signature: (IJ)V
 */
JNIEXPORT void JNICALL Java_CPtr_setLong
  (JNIEnv *env, jobject self, jint index, jlong value)
{
    jbyte *peer = (jbyte *)(*env)->GetLongField(env, self, CPtr_peer_ID);
    memcpy(peer + index, &value, sizeof(value));
}

/*
 * Class:     CPtr
 * Method:    setShort
 * Signature: (IS)V
 */
JNIEXPORT void JNICALL Java_CPtr_setShort
  (JNIEnv *env, jobject self, jint index, jshort value)
{
    jbyte *peer = (jbyte *)(*env)->GetLongField(env, self, CPtr_peer_ID);
    memcpy(peer + index, &value, sizeof(value));
}

/*
 * Class:     CPtr
 * Method:    setString
 * Signature: (ILjava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_CPtr_setString
  (JNIEnv *env, jobject self, jint index, jstring value)
{
    jbyte *peer = (jbyte *)(*env)->GetLongField(env, self, CPtr_peer_ID);
    char *str = getJavaString(env, value);
    if (str == NULL) return;
    strcpy((char *)peer + index, str);
    free(str);
}


/********************************************************************/
/*		     Native methods of class CMalloc		    */
/********************************************************************/

/*
 * Class:     CMalloc
 * Method:    malloc
 * Signature: (I)J
 */
JNIEXPORT jlong JNICALL Java_CMalloc_malloc
  (JNIEnv *env, jclass cls, jint size)
{
    return (jlong)malloc(size);
}

/*
 * Class:     CMalloc
 * Method:    free
 * Signature: (J)V
 */
JNIEXPORT void JNICALL Java_CMalloc_free
  (JNIEnv *env, jclass cls, jlong ptr)
{
    free((void *)ptr);
}


/********************************************************************/
/*			   Utility functions			    */
/********************************************************************/

/* Throw an exception by name */
static void 
throwByName(JNIEnv *env, const char *name, const char *msg)
{
    jclass cls = (*env)->FindClass(env, name);

    if (cls != 0) /* Otherwise an exception has already been thrown */
        (*env)->ThrowNew(env, cls, msg);

    /* It's a good practice to clean up the local references. */
    (*env)->DeleteLocalRef(env, cls);
}

/* Translates a Java string to a C string using the String.getBytes 
 * method, which uses default local encoding.
 */
static char *
getJavaString(JNIEnv *env, jstring jstr)
{
    jbyteArray hab = 0;
    jthrowable exc;
    char *result = 0;

    hab = (*env)->CallObjectMethod(env, jstr, String_getBytes_ID);
    exc = (*env)->ExceptionOccurred(env);
    if (!exc) {
        jint len = (*env)->GetArrayLength(env, hab);
        result = (char *)malloc(len + 1);
	if (result == 0) {
	    throwByName(env, "java/lang/OutOfMemoryError", 0);
	    (*env)->DeleteLocalRef(env, hab);
	    return 0;
	}
	(*env)->GetByteArrayRegion(env, hab, 0, len, (jbyte *)result);
	result[len] = 0; /* NULL-terminate */
    } else {
        (*env)->DeleteLocalRef(env, exc);
    }
    (*env)->DeleteLocalRef(env, hab);
    return result;
}

/* Constructs a Java string from a C array using the String(byte [])
 * constructor, which uses default local encoding.
 */
static jstring
newJavaString(JNIEnv *env, const char *str)
{
    jstring result;
    jbyteArray hab = 0;
    int len;

    len = strlen(str);
    hab = (*env)->NewByteArray(env, len);
    if (hab != 0) {
        (*env)->SetByteArrayRegion(env, hab, 0, len, (jbyte *)str);
	result = (*env)->NewObject(env, classString,
				   String_init_ID, hab);
	(*env)->DeleteLocalRef(env, hab);
	return result;
    }
    return 0;
}

/* Canonicalize NULL pointers */
static jobject makeCPtr(JNIEnv *env, void *p)
{
    jobject obj;
    if (p == NULL) {
        return objectCPtrNULL;
    }
    obj = (*env)->AllocObject(env, classCPtr);
    if (obj) {
        (*env)->SetLongField(env, obj, CPtr_peer_ID, (jlong)p);
    }
    return obj;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -