1 /* Java binding of the RngStream library */
3 /* Copyright (c) 2007-2019. The SimGrid Team. All rights reserved. */
5 /* This program is free software; you can redistribute it and/or modify it
6 * under the terms of the license (GNU LGPL) which comes with this package. */
8 #include "xbt/sysdep.h"
10 #include "jmsg_rngstream.h"
11 #include "jxbt_utilities.hpp"
13 jfieldID jrngstream_bind;
15 RngStream jrngstream_to_native(JNIEnv *env, jobject jrngstream) {
16 RngStream rngstream = (RngStream)(intptr_t)env->GetLongField(jrngstream, jrngstream_bind);
18 jxbt_throw_notbound(env, "rngstream", jrngstream);
24 JNIEXPORT void JNICALL Java_org_simgrid_msg_RngStream_nativeInit(JNIEnv *env, jclass cls) {
25 jclass class_RngStream = env->FindClass("org/simgrid/msg/RngStream");
27 jrngstream_bind = jxbt_get_jfield(env, class_RngStream, "bind", "J");
30 JNIEXPORT void JNICALL Java_org_simgrid_msg_RngStream_create(JNIEnv *env, jobject jrngstream, jstring jname) {
31 const char *name = env->GetStringUTFChars(jname, 0);
32 RngStream rngstream = RngStream_CreateStream(name);
33 //Bind the RngStream object
34 env->SetLongField(jrngstream, jrngstream_bind, (intptr_t)rngstream);
36 env->ReleaseStringUTFChars(jname, name);
39 JNIEXPORT void JNICALL Java_org_simgrid_msg_RngStream_nativeFinalize(JNIEnv *env, jobject jrngstream) {
40 RngStream rngstream = jrngstream_to_native(env, jrngstream);
41 RngStream_DeleteStream(&rngstream);
42 env->SetLongField(jrngstream, jrngstream_bind, (intptr_t)nullptr);
45 JNIEXPORT jboolean JNICALL
46 Java_org_simgrid_msg_RngStream_setPackageSeed(JNIEnv *env, jobject jrngstream, jintArray jseed) {
48 if (jseed == nullptr) {
49 jxbt_throw_null(env, xbt_strdup("seed argument is null"));
54 env->GetIntArrayRegion(jseed, 0, 6, buffer);
56 // The C API expects unsigned long which are wider than int on LP64.
57 // We need to convert:
58 unsigned long seed[6];
59 for (int i = 0; i != 6; ++i)
62 int result = RngStream_SetPackageSeed(seed);
63 return result == -1 ? JNI_FALSE : JNI_TRUE;
66 JNIEXPORT void JNICALL Java_org_simgrid_msg_RngStream_resetStart(JNIEnv *env, jobject jrngstream) {
67 RngStream rngstream = jrngstream_to_native(env, jrngstream);
71 RngStream_ResetStartStream(rngstream);
74 JNIEXPORT void JNICALL Java_org_simgrid_msg_RngStream_resetStartSubstream(JNIEnv *env, jobject jrngstream) {
75 RngStream rngstream = jrngstream_to_native(env, jrngstream);
79 RngStream_ResetStartSubstream(rngstream);
82 JNIEXPORT void JNICALL Java_org_simgrid_msg_RngStream_resetNextSubstream(JNIEnv *env, jobject jrngstream) {
83 RngStream rngstream = jrngstream_to_native(env, jrngstream);
87 RngStream_ResetNextSubstream(rngstream);
90 JNIEXPORT void JNICALL Java_org_simgrid_msg_RngStream_setAntithetic(JNIEnv *env, jobject jrngstream, jboolean ja) {
91 RngStream rngstream = jrngstream_to_native(env, jrngstream);
96 RngStream_SetAntithetic(rngstream,-1);
99 RngStream_SetAntithetic(rngstream,0);
103 JNIEXPORT jboolean JNICALL Java_org_simgrid_msg_RngStream_setSeed(JNIEnv *env, jobject jrngstream, jintArray jseed) {
106 env->GetIntArrayRegion(jseed, 0, 6, buffer);
108 RngStream rngstream = jrngstream_to_native(env, jrngstream);
112 // The C API expects unsigned long which are wider than int on LP64.
113 // We need to convert:
114 unsigned long seed[6];
115 for (int i = 0; i != 6; ++i)
118 int result = RngStream_SetSeed(rngstream, seed);
120 return result == -1 ? JNI_FALSE : JNI_TRUE;
123 JNIEXPORT void JNICALL Java_org_simgrid_msg_RngStream_advanceState(JNIEnv *env, jobject jrngstream, jint e, jint g) {
124 RngStream rngstream = jrngstream_to_native(env, jrngstream);
128 RngStream_AdvanceState(rngstream, (long)e, (long)g);
131 JNIEXPORT jdouble JNICALL Java_org_simgrid_msg_RngStream_randU01(JNIEnv *env, jobject jrngstream) {
132 RngStream rngstream = jrngstream_to_native(env, jrngstream);
136 return (jdouble)RngStream_RandU01(rngstream);
139 JNIEXPORT jint JNICALL Java_org_simgrid_msg_RngStream_randInt(JNIEnv *env, jobject jrngstream, jint i, jint j) {
140 RngStream rngstream = jrngstream_to_native(env, jrngstream);
144 return (jint)RngStream_RandInt(rngstream, (int)i, (int)j);