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 }