3 #include "liba_crc64.h"
6 #define L Java_liba_crc64
16 a_u64 (*eval
)(a_u64
const table
[0x100], void const *pdata
, a_size nbyte
, a_u64 value
);
19 JNIEXPORT
void JNICALL
Java_liba_crc64_clinit(JNIEnv
*_env
, jclass _cls
)
21 jclass _nbb
= (*_env
)->FindClass(_env
, "Ljava/nio/ByteBuffer;");
22 L
._new
= (*_env
)->GetStaticMethodID(_env
, _nbb
, "allocateDirect", "(I)Ljava/nio/ByteBuffer;");
23 L
.ctx
= (*_env
)->GetFieldID(_env
, _cls
, "ctx", "Ljava/nio/ByteBuffer;");
26 JNIEXPORT
void JNICALL
Java_liba_crc64_init(JNIEnv
*_env
, jobject _obj
, jlong poly
, jboolean reversed
)
28 jobject _ctx
= (*_env
)->CallObjectMethod(_env
, _obj
, L
._new
, (jint
)sizeof(struct crc64
));
29 struct crc64
*ctx
= (struct crc64
*)(*_env
)->GetDirectBufferAddress(_env
, _ctx
);
30 (*_env
)->SetObjectField(_env
, _obj
, L
.ctx
, _ctx
);
33 a_crc64l_init(ctx
->table
, (a_u64
)poly
);
38 a_crc64m_init(ctx
->table
, (a_u64
)poly
);
43 JNIEXPORT jlongArray JNICALL
Java_liba_crc64_table(JNIEnv
*_env
, jobject _obj
)
45 jobject _ctx
= (*_env
)->GetObjectField(_env
, _obj
, L
.ctx
);
46 struct crc64
*ctx
= (struct crc64
*)(*_env
)->GetDirectBufferAddress(_env
, _ctx
);
47 jlongArray table
= (*_env
)->NewLongArray(_env
, A_LEN(ctx
->table
));
48 (*_env
)->SetLongArrayRegion(_env
, table
, 0, A_LEN(ctx
->table
), (jlong
*)ctx
->table
);
52 JNIEXPORT jobject JNICALL
Java_liba_crc64_gen(JNIEnv
*_env
, jobject _obj
, jlong poly
, jboolean reversed
)
54 jobject _ctx
= (*_env
)->GetObjectField(_env
, _obj
, L
.ctx
);
55 struct crc64
*ctx
= (struct crc64
*)(*_env
)->GetDirectBufferAddress(_env
, _ctx
);
58 a_crc64l_init(ctx
->table
, (a_u64
)poly
);
63 a_crc64m_init(ctx
->table
, (a_u64
)poly
);
69 JNIEXPORT jlong JNICALL
Java_liba_crc64_eval(JNIEnv
*_env
, jobject _obj
, jbyteArray block
, jlong value
)
71 jobject _ctx
= (*_env
)->GetObjectField(_env
, _obj
, L
.ctx
);
72 struct crc64
*ctx
= (struct crc64
*)(*_env
)->GetDirectBufferAddress(_env
, _ctx
);
73 jsize n
= (*_env
)->GetArrayLength(_env
, block
);
74 jbyte
*p
= (*_env
)->GetByteArrayElements(_env
, block
, NULL
);
75 value
= (jlong
)ctx
->eval(ctx
->table
, p
, (a_size
)n
, (a_u64
)value
);
76 (*_env
)->ReleaseByteArrayElements(_env
, block
, p
, JNI_ABORT
);
80 JNIEXPORT jbyteArray JNICALL
Java_liba_crc64_pack(JNIEnv
*_env
, jobject _obj
, jbyteArray block
, jlong value
)
82 jobject _ctx
= (*_env
)->GetObjectField(_env
, _obj
, L
.ctx
);
83 struct crc64
*ctx
= (struct crc64
*)(*_env
)->GetDirectBufferAddress(_env
, _ctx
);
84 jsize block_n
= (*_env
)->GetArrayLength(_env
, block
);
85 jbyteArray res
= (*_env
)->NewByteArray(_env
, block_n
+ 8);
86 jbyte
*block_p
= (*_env
)->GetByteArrayElements(_env
, block
, NULL
);
87 value
= (jlong
)ctx
->eval(ctx
->table
, block_p
, (a_size
)block_n
, (a_u64
)value
);
88 ctx
->eval
== a_crc64m
? a_u64_setb(&value
, (a_u64
)value
) : a_u64_setl(&value
, (a_u64
)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
, 8, (jbyte
*)&value
);