1 #include "jni_helper.h"
2 #include "native.h"
3 
4 // Handles Java/C interop
5 
get_jni_version(JNIEnv * env)6 jint get_jni_version(JNIEnv* env)
7 {
8 	return (*env)->GetVersion(env);
9 }
read_constant_jstring(JNIEnv * env)10 jstring read_constant_jstring(JNIEnv* env)
11 {
12 	return (*env)->NewStringUTF(env, read_constant_string());
13 }
read_internal_string_as_jstring(JNIEnv * env)14 static jstring read_internal_string_as_jstring(JNIEnv* env)
15 {
16 	return (*env)->NewStringUTF(env, read_internal_string());
17 }
write_jstring(JNIEnv * env,jstring string)18 jstring write_jstring(JNIEnv* env, jstring string)
19 {
20 	const char* utf8_string = (*env)->GetStringUTFChars(env, string, NULL);
21 	write_internal_string(utf8_string);
22 
23 	(*env)->ReleaseStringUTFChars(env, string, utf8_string);
24 	return read_internal_string_as_jstring(env);
25 }
write_jchar_array(JNIEnv * env,jcharArray chars)26 jstring write_jchar_array(JNIEnv* env, jcharArray chars)
27 {
28 	jsize length = (*env)->GetArrayLength(env, chars);
29 	jchar* body = (*env)->GetCharArrayElements(env, chars, NULL);
30 	jstring input = (*env)->NewString(env, body, length);
31 	jstring output = write_jstring(env, input);
32 
33 	(*env)->ReleaseCharArrayElements(env, chars, body, JNI_ABORT);
34 	return output;
35 }
get_string_member_field(JNIEnv * env,jobject helper)36 static jfieldID get_string_member_field(JNIEnv* env, jobject helper)
37 {
38 	jclass class = (*env)->GetObjectClass(env, helper);
39 	return (*env)->GetFieldID(env, class, "stringMember", "Ljava/lang/String;");
40 }
write_string_member(JNIEnv * env,jobject helper)41 jstring write_string_member(JNIEnv* env, jobject helper)
42 {
43 	jfieldID fieldID = get_string_member_field(env, helper);
44 	jstring string = (*env)->GetObjectField(env, helper, fieldID);
45 
46 	return write_jstring(env, string);
47 }
set_string_member_helper(JNIEnv * env,jobject helper,const char * utf8_string)48 static void set_string_member_helper(JNIEnv* env, jobject helper, const char* utf8_string)
49 {
50 	jfieldID fieldID = get_string_member_field(env, helper);
51 	jstring string = (*env)->NewStringUTF(env, utf8_string);
52 	(*env)->SetObjectField(env, helper, fieldID, string);
53 }
set_string_member(JNIEnv * env,jobject helper)54 void set_string_member(JNIEnv* env, jobject helper)
55 {
56 	char stringBuffer[256];
57 	write_external_string(stringBuffer, 256);
58 	set_string_member_helper(env, helper, stringBuffer);
59 }
60 
61 typedef struct
62 {
63 	JNIEnv* env;
64 	jobject object;
65 	jmethodID methodID;
66 } method_parameters;
call_void_java_method(void * context)67 static void call_void_java_method(void* context)
68 {
69 	method_parameters* parameters = (method_parameters*)context;
70 	(*parameters->env)->CallVoidMethod(parameters->env, parameters->object, parameters->methodID);
71 }
execute_java_function(JNIEnv * env,jobject helper)72 void execute_java_function(JNIEnv* env, jobject helper)
73 {
74 	jclass class = (*env)->GetObjectClass(env, helper);
75 	jmethodID methodID = (*env)->GetMethodID(env, class, "HelloManagedWorld", "()V");
76 
77 	method_parameters parameters = {env, helper, methodID};
78 	execute_function(call_void_java_method, (void*)&parameters);
79 }
instantiate_java_class(JNIEnv * env)80 jobject instantiate_java_class(JNIEnv* env)
81 {
82 	jclass class = (*env)->FindClass(env, "JniHelper");
83 	jmethodID methodID = (*env)->GetMethodID(env, class, "<init>", "()V");
84 
85 	jobject object =(*env)->NewObject(env, class, methodID);
86 	set_string_member_helper(env, object, "Instantiated from C");
87 	return object;
88 }
set_and_write_time_in_seconds(JNIEnv * env,jint seconds)89 jstring set_and_write_time_in_seconds(JNIEnv* env, jint seconds)
90 {
91 	set_time_in_seconds((int)seconds);
92 	write_internal_time_in_seconds();
93 	return read_internal_string_as_jstring(env);
94 }
95