1 #include <jni.h>
2 #include <stdlib.h>
3 #include "mixedjava.h"
4 
5 JNIEXPORT jint JNICALL
Java_MixedJava_sum_1array(JNIEnv * env,jclass cls,jintArray arr)6 Java_MixedJava_sum_1array(JNIEnv *env, jclass cls, jintArray arr){
7 	jsize len = (*env)->GetArrayLength(env, arr);
8 	int i, sum = 0;
9 	jint *body = (*env)->GetIntArrayElements(env, arr, 0);
10 	for (i=0; i<len; i++) {
11 		sum += body[i];
12 	}
13 	(*env)->ReleaseIntArrayElements(env, arr, body, 0);
14 	return sum;
15 }
16 
17 
18 JNIEXPORT jint JNICALL
Java_MixedJava_get_1array_1length_1native(JNIEnv * env,jclass cls,jintArray arr)19 Java_MixedJava_get_1array_1length_1native(JNIEnv *env, jclass cls, jintArray arr){
20 	jsize len = (*env)->GetArrayLength(env, arr);
21 	return len;
22 }
23 
24 JNIEXPORT jint JNICALL
Java_MixedJava_return_1element(JNIEnv * env,jclass cls,jintArray arr,jint idx)25 Java_MixedJava_return_1element(JNIEnv *env, jclass cls, jintArray arr, jint idx){
26 	jboolean isCopy = 5;
27 	jint *body = (*env)->GetIntArrayElements(env, arr, &isCopy);
28 	if (isCopy == JNI_TRUE){
29 		return body[1];
30 	}
31 	return body[3];
32 }
33 
34 JNIEXPORT jboolean JNICALL
Java_MixedJava_boolean_1arr(JNIEnv * env,jclass cls,jbooleanArray arr,jint idx)35 Java_MixedJava_boolean_1arr(JNIEnv *env, jclass cls, jbooleanArray arr, jint idx){
36 	jboolean isCopy = 5;
37 	jboolean *body = (*env)->GetBooleanArrayElements(env, arr, &isCopy);
38 	if (isCopy == JNI_TRUE){
39 		jboolean elem = body[idx];
40 		body[idx-1] = JNI_FALSE;
41 		(*env)->ReleaseBooleanArrayElements(env, arr, body, 0);
42 		return elem + 1;
43 	}
44 }
45 
46 JNIEXPORT jbyte JNICALL
Java_MixedJava_byte_1arr(JNIEnv * env,jclass cls,jbyteArray arr,jint idx)47 Java_MixedJava_byte_1arr(JNIEnv *env, jclass cls, jbyteArray arr, jint idx){
48 	jboolean isCopy = 5;
49 	jbyte *body = (*env)->GetByteArrayElements(env, arr, &isCopy);
50 	if (isCopy == JNI_TRUE){
51 		jbyte elem = body[idx];
52 		body[idx-1] = elem + 1;
53 		(*env)->ReleaseByteArrayElements(env, arr, body, 0);
54 		return elem + 1;
55 	}
56 
57 }
58 
59 JNIEXPORT jchar JNICALL
Java_MixedJava_char_1arr(JNIEnv * env,jclass cls,jcharArray arr,jint idx)60 Java_MixedJava_char_1arr(JNIEnv *env, jclass cls, jcharArray arr, jint idx){
61 	jboolean isCopy = 5;
62 	jchar *body = (*env)->GetCharArrayElements(env, arr, &isCopy);
63 	if (isCopy == JNI_TRUE){
64 		jchar elem = body[idx];
65 		body[idx-1] = elem + 1;
66 		(*env)->ReleaseCharArrayElements(env, arr, body, 0);
67 		return elem + 1;
68 	}
69 }
70 
71 JNIEXPORT jshort JNICALL
Java_MixedJava_short_1arr(JNIEnv * env,jclass cls,jshortArray arr,jint idx)72 Java_MixedJava_short_1arr(JNIEnv *env, jclass cls, jshortArray arr, jint idx){
73 	jboolean isCopy = 5;
74 	jshort *body = (*env)->GetShortArrayElements(env, arr, &isCopy);
75 	if (isCopy == JNI_TRUE){
76 		jshort elem = body[idx];
77 		body[idx-1] = elem + 1;
78 		(*env)->ReleaseShortArrayElements(env, arr, body, 0);
79 		return elem + 1;
80 	}
81 }
82 
83 JNIEXPORT jint JNICALL
Java_MixedJava_int_1arr(JNIEnv * env,jclass cls,jintArray arr,jint idx)84 Java_MixedJava_int_1arr(JNIEnv *env, jclass cls, jintArray arr, jint idx){
85 	jboolean isCopy = 5;
86 	jint *body = (*env)->GetIntArrayElements(env, arr, &isCopy);
87 	if (isCopy == JNI_TRUE){
88 		jint elem = body[idx];
89 		body[idx-1] = elem + 1;
90 		(*env)->ReleaseIntArrayElements(env, arr, body, 0);
91 		return elem + 1;
92 	}
93 
94 }
95 
96 JNIEXPORT jlong JNICALL
Java_MixedJava_long_1arr(JNIEnv * env,jclass cls,jlongArray arr,jint idx)97 Java_MixedJava_long_1arr(JNIEnv *env, jclass cls, jlongArray arr, jint idx){
98 	jboolean isCopy = 5;
99 	jlong *body = (*env)->GetLongArrayElements(env, arr, &isCopy);
100 	if (isCopy == JNI_TRUE){
101 		jlong elem = body[idx];
102 		body[idx-1] = elem + 1;
103 		(*env)->ReleaseLongArrayElements(env, arr, body, 0);
104 		return elem + 1;
105 	}
106 }
107 
108 JNIEXPORT jint JNICALL
Java_MixedJava_1arr_1symbolic(JNIEnv * env,jclass cls,jintArray arr,jint idx)109 Java_MixedJava_1arr_1symbolic(JNIEnv *env, jclass cls, jintArray arr, jint idx){
110 	jint *body = (*env)->GetIntArrayElements(env, arr, 0);
111 	if (idx == 223)
112 		return body[idx];
113 	else
114 		return 0;
115 }
116 
117 JNIEXPORT jint JNICALL
Java_MixedJava_int_1arr_1region(JNIEnv * env,jclass cls,jintArray arr,jint start_idx,jint length)118 Java_MixedJava_int_1arr_1region(JNIEnv *env, jclass cls, jintArray arr, jint start_idx, jint length){
119 	jint *buf = (jint*) malloc(length * sizeof(jint));
120 	(*env)->GetIntArrayRegion(env, arr, start_idx, length, buf);
121 	jint result = 0;
122 	for (int i=0; i < length; i++)
123 		result += buf[i];
124 	return result;
125 }
126 
127 JNIEXPORT jint JNICALL
Java_MixedJava_modify_1int_1arr(JNIEnv * env,jclass cls,jintArray arr)128 Java_MixedJava_modify_1int_1arr(JNIEnv *env, jclass cls, jintArray arr){
129 	jboolean isCopy = JNI_FALSE;
130 	jint *body = (*env)->GetIntArrayElements(env, arr, &isCopy);
131 	body[0] = 4;
132 	body[1] = 3;
133 	body[3] = 1;
134 	body[4] = 0;
135 	if (isCopy == JNI_TRUE)
136 		(*env)->ReleaseIntArrayElements(env, arr, body, 0);
137 }
138 
139 JNIEXPORT void JNICALL
Java_MixedJava_modify_1int_1arr_1region(JNIEnv * env,jclass cls,jintArray arr,jint start_idx,jint length)140 Java_MixedJava_modify_1int_1arr_1region(JNIEnv *env, jclass cls, jintArray arr, jint start_idx, jint length){
141 	jint *buf = (jint*) malloc(3 * sizeof(jint));
142 	(*env)->GetIntArrayRegion(env, arr, start_idx, length, buf);
143 
144 	jint tmp = buf[0];
145 	buf[0] = buf[2];
146 	buf[2] = tmp;
147 
148 	(*env)->SetIntArrayRegion(env, arr, start_idx, length, buf);
149 }
150 
151 JNIEXPORT jintArray JNICALL
Java_MixedJava_new_1int_1array(JNIEnv * env,jclass cls)152 Java_MixedJava_new_1int_1array(JNIEnv *env, jclass cls){
153 	int arr[] = {0, 1, 2, 3, 4};
154 	jintArray java_arr = (*env)->NewIntArray(env, 5);
155 	(*env)->SetIntArrayRegion(env, java_arr, 0, 5, arr);
156 	return java_arr;
157 }