├── .gitignore ├── .idea ├── .name ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── encodings.xml ├── gradle.xml ├── misc.xml ├── modules.xml ├── runConfigurations.xml └── vcs.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── libs │ └── swissephSWI-2.00.00-01.jar ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── org │ │ └── swissephemeris │ │ └── swissephemeris │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── org │ │ │ └── swissephemeris │ │ │ └── swissephemeris │ │ │ ├── Chartdata.java │ │ │ └── CopyAssetfiles.java │ └── res │ │ ├── layout │ │ └── activity_fullscreen.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ └── values │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── org │ └── swissephemeris │ └── swissephemeris │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | SwissEphemeris -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 18 | 19 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 19 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 46 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AndroidSwissEphemerisExample 2 | 3 | This is an example of how to include Thomas Mack's Java Swiss Ephemeris (http://www.th-mack.de/international/download/index.html) .jar file in an Android Studio Project using contributed code http://www.th-mack.de/download/contrib/android_swisseph.zip. 4 | 5 | As far as I can tell all you need to do is put the swissephSWI-2.00.00-01.jar file in the app/libs directory. 6 | 7 | And the line https://github.com/AaronNGray/AndroidSwissEphemerisExample/blob/master/app/build.gradle#L23 will include the library automatically. 8 | 9 | Modified https://github.com/AaronNGray/AndroidSwissEphemerisExample/blob/master/app/src/main/java/org/swissephemeris/swissephemeris/Chartdata.java to give topocentric values. 10 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 23 5 | buildToolsVersion "23.0.2" 6 | 7 | defaultConfig { 8 | applicationId "org.swissephemeris.swissephemeris" 9 | minSdkVersion 16 10 | targetSdkVersion 23 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | testCompile 'junit:junit:4.12' 25 | compile 'com.android.support:appcompat-v7:23.1.1' 26 | compile 'com.android.support:support-v4:23.1.1' 27 | } 28 | -------------------------------------------------------------------------------- /app/libs/swissephSWI-2.00.00-01.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AaronNGray/AndroidSwissEphemerisExample/ebbc79b55c8e21da9c48fe1b2493f455208b11b8/app/libs/swissephSWI-2.00.00-01.jar -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in C:\Users\Aaron\AppData\Local\Android\sdk2/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/org/swissephemeris/swissephemeris/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package org.swissephemeris.swissephemeris; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/java/org/swissephemeris/swissephemeris/Chartdata.java: -------------------------------------------------------------------------------- 1 | package org.swissephemeris.swissephemeris; 2 | 3 | import swisseph.SweConst; 4 | import swisseph.SweDate; 5 | import swisseph.SwissEph; 6 | 7 | import android.os.Bundle; 8 | import android.support.v7.app.AppCompatActivity; 9 | import android.view.Menu; 10 | import android.view.MenuItem; 11 | import android.widget.TextView; 12 | 13 | import java.io.File; 14 | import java.util.Locale; 15 | 16 | 17 | public class Chartdata extends AppCompatActivity { 18 | TextView tv; 19 | 20 | @Override 21 | protected void onCreate(Bundle savedInstanceState) { 22 | super.onCreate(savedInstanceState); 23 | setContentView(R.layout.activity_fullscreen); 24 | tv = (TextView) findViewById(R.id.fullscreen_content); 25 | 26 | new CopyAssetfiles(".*\\.se1", getApplicationContext()).copy(); 27 | computeChart(); 28 | } 29 | 30 | private void computeChart() { 31 | // Input data: 32 | int year = 1948; 33 | int month = 5; 34 | int day = 31; 35 | double longitude = 80 + 17 / 60.0; // Chennai 36 | double latitude = 13 + 5 / 60.0; 37 | double hour = 19 + 20. / 60. - 5.5; // IST 38 | String printString; 39 | 40 | /*Instances of utility classes */ 41 | SwissEph sw = new SwissEph(getApplicationContext().getFilesDir() + File.separator + "/ephe"); 42 | SweDate sd = new SweDate(year, month, day, hour); 43 | 44 | // Set sidereal mode: 45 | sw.swe_set_sid_mode(SweConst.SE_SIDM_LAHIRI, 0, 0); 46 | 47 | // b. Topocentric positions 48 | // To compute topocentric positions, i.e. positions referred to the place of the observer (the birth place) rather than to the center of the earth, do as follows: 49 | // - call swe_set_topo(geo_lon, geo_lat, altitude_above_sea) (The longitude and latitude must be in degrees, the altitude in meters.) 50 | // - add the flag SEFLG_TOPOCTR toiflag 51 | // - call swe_calc(...) 52 | 53 | // Set the geographic location for topocentric planet computation 54 | sw.swe_set_topo( 55 | -2.35, // double geolon, geographic longitude 56 | // eastern longitude is positive, 57 | // western longitude is negative, 58 | 51.5, // double geolat, geographic latitude 59 | // northern latitude is positive, 60 | // southern latitude is negative */ 61 | 0 // double altitude, altitude above sea 62 | ); 63 | // Print input details: 64 | printString = getDateinfo(sd); 65 | printString += getLocationinfo(longitude, latitude); 66 | 67 | ////////////////////////////////////////////// 68 | // Output ayanamsa value: 69 | ////////////////////////////////////////////// 70 | printString += "\n" + getAyanamsainfo(sw, sd); 71 | 72 | ////////////////////////////////////////////// 73 | // Output lagna: 74 | ////////////////////////////////////////////// 75 | printString += getLagnainfo(sw, sd, longitude, latitude); 76 | 77 | ////////////////////////////////////////////// 78 | // Calculate all planets: 79 | ////////////////////////////////////////////// 80 | printString += "\n" + getAllplanets(sw, sd); 81 | 82 | tv.setText(printString); 83 | } 84 | 85 | private String getAllplanets(SwissEph sw, SweDate sd) { 86 | double[] xp = new double[6]; 87 | StringBuffer serr = new StringBuffer(); 88 | String s = ""; 89 | 90 | int[] planets = { SweConst.SE_SUN, 91 | SweConst.SE_MOON, 92 | SweConst.SE_MARS, 93 | SweConst.SE_MERCURY, 94 | SweConst.SE_JUPITER, 95 | SweConst.SE_VENUS, 96 | SweConst.SE_SATURN, 97 | SweConst.SE_TRUE_NODE }; // Some systems prefer SE_MEAN_NODE 98 | 99 | int flags = SweConst.SEFLG_TOPOCTR | // topocentric !!!! 100 | SweConst.SEFLG_SWIEPH | // slow and least accurate calculation method 101 | SweConst.SEFLG_SIDEREAL | // sidereal zodiac 102 | SweConst.SEFLG_NONUT | // will be set automatically for sidereal calculations, if not set here 103 | SweConst.SEFLG_SPEED; // to determine retrograde vs. direct motion 104 | boolean retrograde = false; 105 | 106 | for(int p = 0; p < planets.length; p++) { 107 | int planet = planets[p]; 108 | String planetName = sw.swe_get_planet_name(planet); 109 | int ret = sw.swe_calc_ut(sd.getJulDay(), 110 | planet, 111 | flags, 112 | xp, 113 | serr); 114 | 115 | if (ret != flags) { 116 | if (serr.length() > 0) { 117 | System.err.println("Warning: " + serr); 118 | } else { 119 | System.err.println( 120 | String.format("Warning, different flags used (0x%x)", ret)); 121 | } 122 | } 123 | 124 | retrograde = (xp[3] < 0); 125 | 126 | s += String.format("%-9s %s %c\n", 127 | planetName, toDMS(xp[0]), (retrograde ? 'R' : 'D')); 128 | } 129 | // KETU 130 | xp[0] = (xp[0] + 180.0) % 360; 131 | String planetName = "Ketu"; 132 | 133 | s += String.format("%-9s %s %c\n", 134 | planetName, toDMS(xp[0]), (retrograde ? 'R' : 'D')); 135 | return s; 136 | } 137 | 138 | private String getAyanamsainfo(SwissEph sw, SweDate sd) { 139 | double ayanamsa = sw.swe_get_ayanamsa_ut(sd.getJulDay()); 140 | return "Ayanamsa " + toDMS(ayanamsa) + "\n"; 141 | } 142 | 143 | private String getLocationinfo(double longitude, double latitude) { 144 | return "\nLocation " + 145 | toDMS(longitude) + (longitude > 0 ? "E" : "W") + 146 | "\n " + 147 | toDMS(latitude) + (latitude > 0 ? "N" : "S"); 148 | } 149 | 150 | private String getDateinfo(SweDate sd) { 151 | double hour = sd.getHour() + 0.5/3600.; 152 | int min = (int)((hour - (int)hour) * 60); 153 | int sec = (int)(((hour - (int)hour) * 60 - min) * 60); 154 | return String.format(Locale.US, "Date: %4d-%02d-%02d, %d:%02d:%02dh UTC / %.8fh\nJul.day: %.6f\nDelta t: %s\n", 155 | sd.getYear(), 156 | sd.getMonth(), 157 | sd.getDay(), 158 | (int)hour, 159 | min, 160 | sec, 161 | hour, 162 | sd.getJulDay(), 163 | toDMS(sd.getDeltaT())); 164 | } 165 | 166 | private String getLagnainfo(SwissEph sw, SweDate sd, double longitude, double latitude) { 167 | int flags = SweConst.SEFLG_SIDEREAL; 168 | double[] cusps = new double[13]; 169 | double[] acsc = new double[10]; 170 | 171 | int result = sw.swe_houses(sd.getJulDay(), 172 | flags, 173 | latitude, 174 | longitude, 175 | 'P', 176 | cusps, 177 | acsc); 178 | 179 | return "Ascendant " + toDMS(acsc[0]) + "\n"; 180 | } 181 | 182 | static String toDMS(double d) { 183 | d += 0.5/3600./10000.; // round to 1/1000 of a second 184 | int deg = (int) d; 185 | d = (d - deg) * 60; 186 | int min = (int) d; 187 | d = (d - min) * 60; 188 | double sec = d; 189 | 190 | return String.format("%3d° %02d' %07.4f\"", deg, min, sec); 191 | } 192 | } 193 | -------------------------------------------------------------------------------- /app/src/main/java/org/swissephemeris/swissephemeris/CopyAssetfiles.java: -------------------------------------------------------------------------------- 1 | package org.swissephemeris.swissephemeris; 2 | 3 | import android.content.Context; 4 | import android.content.res.AssetManager; 5 | import android.util.Log; 6 | 7 | import java.io.File; 8 | import java.io.FileOutputStream; 9 | import java.io.IOException; 10 | import java.io.InputStream; 11 | import java.io.OutputStream; 12 | 13 | /** 14 | * Created by mack on 06.10.2014. 15 | */ 16 | public class CopyAssetfiles { 17 | String pattern; 18 | Context ct; 19 | 20 | public CopyAssetfiles(String pattern, Context ct) { 21 | this.pattern = pattern; 22 | this.ct = ct; 23 | } 24 | void copy() { 25 | AssetManager assetManager = ct.getAssets(); 26 | String[] files = null; 27 | try { 28 | files = assetManager.list(""); 29 | } catch (IOException e) { 30 | Log.e("tag", "Failed to get asset file list.", e); 31 | } 32 | 33 | String outdir = ct.getFilesDir() + File.separator + "/ephe"; 34 | new File(outdir).mkdirs(); 35 | outdir += File.separator; 36 | 37 | for(String filename : files) { 38 | if (new File(outdir + filename).exists() || !filename.matches(pattern)) { 39 | continue; 40 | } 41 | 42 | InputStream in = null; 43 | OutputStream out = null; 44 | try { 45 | in = assetManager.open(filename); 46 | 47 | File outFile = new File(outdir, filename); 48 | 49 | out = new FileOutputStream(outFile); 50 | copyFile(in, out); 51 | in.close(); 52 | in = null; 53 | out.flush(); 54 | out.close(); 55 | out = null; 56 | } catch(IOException e) { 57 | Log.e("tag", "Failed to copy asset file: " + filename, e); 58 | } 59 | } 60 | } 61 | private void copyFile(InputStream in, OutputStream out) throws IOException { 62 | byte[] buffer = new byte[1024]; 63 | int read; 64 | while((read = in.read(buffer)) != -1){ 65 | out.write(buffer, 0, read); 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_fullscreen.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 11 | 21 | 22 | 24 | 25 | 27 | 34 | 35 | 44 | 45 |