📄 dispatch.c
字号:
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 + -