blob: 27773f84bcef2df6f48f4924d07409cd5ac09382 [file] [log] [blame]
The Android Open Source Projectadc854b2009-03-03 19:28:47 -08001/*
2 * Copyright 2006 The Android Open Source Project
3 *
4 * Native functions for java.lang.StrictMath.
5 */
6#include "jni.h"
7#include "JNIHelp.h"
8
9#include <stdlib.h>
10/* This static way is the "best" way to integrate fdlibm without a conflict
Elliott Hughesace7e6f2010-03-26 23:23:38 -070011 * into the android environment.
The Android Open Source Projectadc854b2009-03-03 19:28:47 -080012 */
13
The Android Open Source Projectadc854b2009-03-03 19:28:47 -080014#if defined(__P)
15#undef __P
16#endif /* defined(__P) */
17
18#include "../../external/fdlibm/fdlibm.h"
19_LIB_VERSION_TYPE _LIB_VERSION = _IEEE_;
20
21/* native public static double sin(double a); */
Brian Carlstrom44e0e562010-05-06 23:44:16 -070022static jdouble jsin(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a)
The Android Open Source Projectadc854b2009-03-03 19:28:47 -080023{
24 return ieee_sin(a);
25}
26
27/* native public static double cos(double a); */
Brian Carlstrom44e0e562010-05-06 23:44:16 -070028static jdouble jcos(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a)
The Android Open Source Projectadc854b2009-03-03 19:28:47 -080029{
30 return ieee_cos(a);
31}
32
33/* native public static double tan(double a); */
Brian Carlstrom44e0e562010-05-06 23:44:16 -070034static jdouble jtan(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a)
The Android Open Source Projectadc854b2009-03-03 19:28:47 -080035{
36 return ieee_tan(a);
37}
38
39/* native public static double asin(double a); */
Brian Carlstrom44e0e562010-05-06 23:44:16 -070040static jdouble jasin(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a)
The Android Open Source Projectadc854b2009-03-03 19:28:47 -080041{
42 return ieee_asin(a);
43}
44
45/* native public static double acos(double a); */
Brian Carlstrom44e0e562010-05-06 23:44:16 -070046static jdouble jacos(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a)
The Android Open Source Projectadc854b2009-03-03 19:28:47 -080047{
48 return ieee_acos(a);
49}
50
51/* native public static double atan(double a); */
Brian Carlstrom44e0e562010-05-06 23:44:16 -070052static jdouble jatan(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a)
The Android Open Source Projectadc854b2009-03-03 19:28:47 -080053{
54 return ieee_atan(a);
55}
56
57/* native public static double exp(double a); */
Brian Carlstrom44e0e562010-05-06 23:44:16 -070058static jdouble jexp(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a)
The Android Open Source Projectadc854b2009-03-03 19:28:47 -080059{
60 return ieee_exp(a);
61}
62
63/* native public static double log(double a); */
Brian Carlstrom44e0e562010-05-06 23:44:16 -070064static jdouble jlog(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a)
The Android Open Source Projectadc854b2009-03-03 19:28:47 -080065{
66 return ieee_log(a);
67}
68
69/* native public static double sqrt(double a); */
Brian Carlstrom44e0e562010-05-06 23:44:16 -070070static jdouble jsqrt2(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a)
The Android Open Source Projectadc854b2009-03-03 19:28:47 -080071{
72 return ieee_sqrt(a);
73}
74
75/* native public static double IEEEremainder(double a, double b); */
Brian Carlstrom44e0e562010-05-06 23:44:16 -070076static jdouble jieee_remainder(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a, jdouble b)
The Android Open Source Projectadc854b2009-03-03 19:28:47 -080077{
78 return ieee_remainder(a, b);
79}
80
81/* native public static double floor(double a); */
Brian Carlstrom44e0e562010-05-06 23:44:16 -070082static jdouble jfloor(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a)
The Android Open Source Projectadc854b2009-03-03 19:28:47 -080083{
84 return ieee_floor(a);
85}
86
87/* native public static double ceil(double a); */
Brian Carlstrom44e0e562010-05-06 23:44:16 -070088static jdouble jceil(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a)
The Android Open Source Projectadc854b2009-03-03 19:28:47 -080089{
90 return ieee_ceil(a);
91}
92
93/* native public static double rint(double a); */
Brian Carlstrom44e0e562010-05-06 23:44:16 -070094static jdouble jrint(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a)
The Android Open Source Projectadc854b2009-03-03 19:28:47 -080095{
96 return ieee_rint(a);
97}
98
99/* native public static double atan2(double a, double b); */
Brian Carlstrom44e0e562010-05-06 23:44:16 -0700100static jdouble jatan2(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a, jdouble b)
The Android Open Source Projectadc854b2009-03-03 19:28:47 -0800101{
102 return ieee_atan2(a, b);
103}
104
105/* native public static double pow(double a, double b); */
Brian Carlstrom44e0e562010-05-06 23:44:16 -0700106static jdouble jpow(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a, jdouble b)
The Android Open Source Projectadc854b2009-03-03 19:28:47 -0800107{
108 return ieee_pow(a,b);
109}
110
111/* native public static double sinh(double a); */
Brian Carlstrom44e0e562010-05-06 23:44:16 -0700112static jdouble jsinh(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a)
The Android Open Source Projectadc854b2009-03-03 19:28:47 -0800113{
114 return ieee_sinh(a);
115}
116
117/* native public static double tanh(double a); */
Brian Carlstrom44e0e562010-05-06 23:44:16 -0700118static jdouble jtanh(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a)
The Android Open Source Projectadc854b2009-03-03 19:28:47 -0800119{
120 return ieee_tanh(a);
121}
122
123/* native public static double cosh(double a); */
Brian Carlstrom44e0e562010-05-06 23:44:16 -0700124static jdouble jcosh(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a)
The Android Open Source Projectadc854b2009-03-03 19:28:47 -0800125{
126 return ieee_cosh(a);
127}
128
129/* native public static double log10(double a); */
Brian Carlstrom44e0e562010-05-06 23:44:16 -0700130static jdouble jlog10(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a)
The Android Open Source Projectadc854b2009-03-03 19:28:47 -0800131{
132 return ieee_log10(a);
133}
134
135/* native public static double cbrt(double a); */
Brian Carlstrom44e0e562010-05-06 23:44:16 -0700136static jdouble jcbrt(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a)
The Android Open Source Projectadc854b2009-03-03 19:28:47 -0800137{
138 return ieee_cbrt(a);
139}
140
141/* native public static double expm1(double a); */
Brian Carlstrom44e0e562010-05-06 23:44:16 -0700142static jdouble jexpm1(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a)
The Android Open Source Projectadc854b2009-03-03 19:28:47 -0800143{
144 return ieee_expm1(a);
145}
146
147/* native public static double hypot(double a, double b); */
Brian Carlstrom44e0e562010-05-06 23:44:16 -0700148static jdouble jhypot(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a, jdouble b)
The Android Open Source Projectadc854b2009-03-03 19:28:47 -0800149{
150 return ieee_hypot(a, b);
151}
152
153/* native public static double log1p(double a); */
Brian Carlstrom44e0e562010-05-06 23:44:16 -0700154static jdouble jlog1p(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a)
The Android Open Source Projectadc854b2009-03-03 19:28:47 -0800155{
156 return ieee_log1p(a);
157}
158
159/* native public static double nextafter(double a, double b); */
Brian Carlstrom44e0e562010-05-06 23:44:16 -0700160static jdouble jnextafter(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a, jdouble b)
The Android Open Source Projectadc854b2009-03-03 19:28:47 -0800161{
162 return ieee_nextafter(a, b);
163}
164
165/* native public static float nextafterf(float a, float b); */
Brian Carlstrom44e0e562010-05-06 23:44:16 -0700166static jfloat jnextafterf(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jfloat arg1, jfloat arg2)
The Android Open Source Projectadc854b2009-03-03 19:28:47 -0800167{
168 jint hx = *(jint*)&arg1;
169 jint hy = *(jint*)&arg2;
170
171 if (!(hx&0x7fffffff)) { /* arg1 == 0 */
172 *(jint*)&arg1 = (hy & 0x80000000) | 0x1;
173 return arg1;
174 }
175
176 if((hx > 0) ^ (hx > hy)) { /* |arg1| < |arg2| */
177 hx += 1;
178 } else {
179 hx -= 1;
180 }
181 *(jint*)&arg1 = hx;
182 return arg1;
183}
184
The Android Open Source Projectadc854b2009-03-03 19:28:47 -0800185static JNINativeMethod gMethods[] = {
The Android Open Source Projectadc854b2009-03-03 19:28:47 -0800186 { "IEEEremainder", "(DD)D", jieee_remainder },
Elliott Hughesace7e6f2010-03-26 23:23:38 -0700187 { "acos", "(D)D", jacos },
188 { "asin", "(D)D", jasin },
189 { "atan", "(D)D", jatan },
The Android Open Source Projectadc854b2009-03-03 19:28:47 -0800190 { "atan2", "(DD)D", jatan2 },
The Android Open Source Projectadc854b2009-03-03 19:28:47 -0800191 { "cbrt", "(D)D", jcbrt },
Elliott Hughesace7e6f2010-03-26 23:23:38 -0700192 { "ceil", "(D)D", jceil },
Elliott Hughesace7e6f2010-03-26 23:23:38 -0700193 { "cos", "(D)D", jcos },
194 { "cosh", "(D)D", jcosh },
195 { "exp", "(D)D", jexp },
The Android Open Source Projectadc854b2009-03-03 19:28:47 -0800196 { "expm1", "(D)D", jexpm1 },
Elliott Hughesace7e6f2010-03-26 23:23:38 -0700197 { "floor", "(D)D", jfloor },
The Android Open Source Projectadc854b2009-03-03 19:28:47 -0800198 { "hypot", "(DD)D", jhypot },
Elliott Hughesace7e6f2010-03-26 23:23:38 -0700199 { "log", "(D)D", jlog },
200 { "log10", "(D)D", jlog10 },
The Android Open Source Projectadc854b2009-03-03 19:28:47 -0800201 { "log1p", "(D)D", jlog1p },
202 { "nextafter", "(DD)D", jnextafter },
203 { "nextafterf", "(FF)F", jnextafterf },
Elliott Hughesace7e6f2010-03-26 23:23:38 -0700204 { "pow", "(DD)D", jpow },
205 { "rint", "(D)D", jrint },
206 { "sin", "(D)D", jsin },
207 { "sinh", "(D)D", jsinh },
208 { "sqrt", "(D)D", jsqrt2 },
209 { "tan", "(D)D", jtan },
210 { "tanh", "(D)D", jtanh },
The Android Open Source Projectadc854b2009-03-03 19:28:47 -0800211};
212
Elliott Hughesc08f9fb2010-04-16 17:44:12 -0700213int register_java_lang_StrictMath(JNIEnv* env) {
214 return jniRegisterNativeMethods(env, "java/lang/StrictMath", gMethods, NELEM(gMethods));
The Android Open Source Projectadc854b2009-03-03 19:28:47 -0800215}