Home | History | Annotate | Download | only in native
      1 //
      2 //  java_lang_Double.c
      3 //  Android
      4 //
      5 //  Copyright 2005 The Android Open Source Project
      6 //
      7 #include "JNIHelp.h"
      8 
      9 #include <math.h>
     10 #include <stdlib.h>
     11 #include <stdio.h>
     12 #include <stdint.h>
     13 
     14 typedef union {
     15     uint64_t    bits;
     16     double      d;
     17 } Double;
     18 
     19 #define NaN (0x7ff8000000000000ULL)
     20 
     21 /*
     22  * public static native long doubleToLongBits(double value)
     23  */
     24 static jlong doubleToLongBits(JNIEnv* env, jclass clazz, jdouble val)
     25 {
     26     Double   d;
     27 
     28     d.d = val;
     29 
     30     //  For this method all values in the NaN range are
     31     //  normalized to the canonical NaN value.
     32 
     33     if (isnan(d.d))
     34         d.bits = NaN;
     35 
     36     return d.bits;
     37 }
     38 
     39 /*
     40  * public static native long doubleToRawLongBits(double value)
     41  */
     42 static jlong doubleToRawLongBits(JNIEnv* env, jclass clazz, jdouble val)
     43 {
     44     Double   d;
     45 
     46     d.d = val;
     47 
     48     return d.bits;
     49 }
     50 
     51 /*
     52  * public static native double longBitsToDouble(long bits)
     53  */
     54 static jdouble longBitsToDouble(JNIEnv* env, jclass clazz, jlong val)
     55 {
     56     Double   d;
     57 
     58     d.bits = val;
     59 
     60     return d.d;
     61 }
     62 
     63 /*
     64  * JNI registration
     65  */
     66 static JNINativeMethod gMethods[] = {
     67     /* name, signature, funcPtr */
     68     { "doubleToLongBits",       "(D)J",     doubleToLongBits },
     69     { "doubleToRawLongBits",    "(D)J",     doubleToRawLongBits },
     70     { "longBitsToDouble",       "(J)D",     longBitsToDouble },
     71 };
     72 int register_java_lang_Double(JNIEnv* env)
     73 {
     74     return jniRegisterNativeMethods(env, "java/lang/Double",
     75                 gMethods, NELEM(gMethods));
     76 }
     77 
     78