3 #include "liba_crc16.h"
6 #define L Java_liba_crc16
13 JNIEXPORT
void JNICALL
Java_liba_crc16_clinit(JNIEnv
*_env
, jclass _cls
)
15 jclass _nbb
= (*_env
)->FindClass(_env
, "Ljava/nio/ByteBuffer;");
16 L
._new
= (*_env
)->GetStaticMethodID(_env
, _nbb
, "allocateDirect", "(I)Ljava/nio/ByteBuffer;");
17 L
.ctx
= (*_env
)->GetFieldID(_env
, _cls
, "ctx", "Ljava/nio/ByteBuffer;");
23 a_u16 (*eval
)(a_u16
const table
[0x100], void const *pdata
, a_size nbyte
, a_u16 value
);
26 JNIEXPORT
void JNICALL
Java_liba_crc16_init(JNIEnv
*_env
, jobject _obj
, jshort poly
, jboolean reversed
)
28 jobject _ctx
= (*_env
)->CallObjectMethod(_env
, _obj
, L
._new
, (jint
)sizeof(struct crc16
));
29 struct crc16
*ctx
= (struct crc16
*)(*_env
)->GetDirectBufferAddress(_env
, _ctx
);
30 (*_env
)->SetObjectField(_env
, _obj
, L
.ctx
, _ctx
);
33 a_crc16l_init(ctx
->table
, (a_u16
)poly
);
38 a_crc16m_init(ctx
->table
, (a_u16
)poly
);
43 JNIEXPORT jshortArray JNICALL
Java_liba_crc16_table(JNIEnv
*_env
, jobject _obj
)
45 jobject _ctx
= (*_env
)->GetObjectField(_env
, _obj
, L
.ctx
);
46 struct crc16
*ctx
= (struct crc16
*)(*_env
)->GetDirectBufferAddress(_env
, _ctx
);
47 jshortArray table
= (*_env
)->NewShortArray(_env
, A_LEN(ctx
->table
));
48 (*_env
)->SetShortArrayRegion(_env
, table
, 0, A_LEN(ctx
->table
), (jshort
*)ctx
->table
);
52 JNIEXPORT jobject JNICALL
Java_liba_crc16_gen(JNIEnv
*_env
, jobject _obj
, jshort poly
, jboolean reversed
)
54 jobject _ctx
= (*_env
)->GetObjectField(_env
, _obj
, L
.ctx
);
55 struct crc16
*ctx
= (struct crc16
*)(*_env
)->GetDirectBufferAddress(_env
, _ctx
);
58 a_crc16l_init(ctx
->table
, (a_u16
)poly
);
63 a_crc16m_init(ctx
->table
, (a_u16
)poly
);
69 JNIEXPORT jshort JNICALL
Java_liba_crc16_eval(JNIEnv
*_env
, jobject _obj
, jbyteArray block
, jshort value
)
71 jobject _ctx
= (*_env
)->GetObjectField(_env
, _obj
, L
.ctx
);
72 struct crc16
*ctx
= (struct crc16
*)(*_env
)->GetDirectBufferAddress(_env
, _ctx
);
73 jsize n
= (*_env
)->GetArrayLength(_env
, block
);
74 jbyte
*p
= (*_env
)->GetByteArrayElements(_env
, block
, NULL
);
75 value
= (jshort
)ctx
->eval(ctx
->table
, p
, (a_size
)n
, (a_u16
)value
);
76 (*_env
)->ReleaseByteArrayElements(_env
, block
, p
, JNI_ABORT
);
80 JNIEXPORT jbyteArray JNICALL
Java_liba_crc16_pack(JNIEnv
*_env
, jobject _obj
, jbyteArray block
, jshort value
)
82 jobject _ctx
= (*_env
)->GetObjectField(_env
, _obj
, L
.ctx
);
83 struct crc16
*ctx
= (struct crc16
*)(*_env
)->GetDirectBufferAddress(_env
, _ctx
);
84 jsize block_n
= (*_env
)->GetArrayLength(_env
, block
);
85 jbyteArray res
= (*_env
)->NewByteArray(_env
, block_n
+ 2);
86 jbyte
*block_p
= (*_env
)->GetByteArrayElements(_env
, block
, NULL
);
87 value
= (jshort
)ctx
->eval(ctx
->table
, block_p
, (a_size
)block_n
, (a_u16
)value
);
88 ctx
->eval
== a_crc16m
? a_u16_setb(&value
, (a_u16
)value
) : a_u16_setl(&value
, (a_u16
)value
);
89 (*_env
)->SetByteArrayRegion(_env
, res
, 0, block_n
, block_p
);
90 (*_env
)->ReleaseByteArrayElements(_env
, block
, block_p
, JNI_ABORT
);
91 (*_env
)->SetByteArrayRegion(_env
, res
, block_n
, 2, (jbyte
*)&value
);