From e1d755cfc3c6007226bb90085fa167c4db6dd89d Mon Sep 17 00:00:00 2001 From: ya0211 Date: Fri, 30 Jun 2023 00:08:10 +0800 Subject: [PATCH] Use gomobile to build native libraries --- .github/workflows/android.yml | 4 +- app/src/main/cpp/CMakeLists.txt | 18 -- app/src/main/cpp/geomag.cpp | 33 --- app/src/main/cpp/geomag.h | 19 -- app/src/main/cpp/igrf-jni.cpp | 31 --- app/src/main/cpp/logging.h | 14 -- app/src/main/cpp/wmm-jni.cpp | 37 --- app/src/main/golang/Geomag.go | 67 +++++ app/src/main/golang/MagneticField.go | 45 ++++ app/src/main/golang/build.py | 228 ------------------ app/src/main/golang/go.mod | 7 + app/src/main/golang/go.sum | 8 + app/src/main/golang/igrf/main.go | 27 --- app/src/main/golang/wmm/main.go | 55 ----- .../main/kotlin/com/sanmer/geomag/Geomag.kt | 70 ++++-- .../com/sanmer/geomag/model/MagneticField.kt | 19 ++ 16 files changed, 194 insertions(+), 488 deletions(-) delete mode 100644 app/src/main/cpp/CMakeLists.txt delete mode 100644 app/src/main/cpp/geomag.cpp delete mode 100644 app/src/main/cpp/geomag.h delete mode 100644 app/src/main/cpp/igrf-jni.cpp delete mode 100644 app/src/main/cpp/logging.h delete mode 100644 app/src/main/cpp/wmm-jni.cpp create mode 100644 app/src/main/golang/Geomag.go create mode 100644 app/src/main/golang/MagneticField.go delete mode 100755 app/src/main/golang/build.py delete mode 100644 app/src/main/golang/igrf/main.go delete mode 100644 app/src/main/golang/wmm/main.go diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 3b5c8c6..87b09cb 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -58,9 +58,9 @@ jobs: local-cache: true - name: Build Golang library - run: python3 app/src/main/golang/build.py -m 26 -a all -d + run: go generate app/src/main/golang/Geomag.go env: - ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }} + ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }} - name: Set up Gradle uses: gradle/gradle-build-action@v2 diff --git a/app/src/main/cpp/CMakeLists.txt b/app/src/main/cpp/CMakeLists.txt deleted file mode 100644 index 9618c0e..0000000 --- a/app/src/main/cpp/CMakeLists.txt +++ /dev/null @@ -1,18 +0,0 @@ -cmake_minimum_required(VERSION 3.22.1) - -project(Geomag) - -set(CMAKE_C_FLAGS_RELWITHDEBINFO ${CMAKE_C_FLAGS_RELEASE}) -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO ${CMAKE_C_FLAGS_RELWITHDEBINFO}) -set(LIBS_DIR ${CMAKE_SOURCE_DIR}/../golang/libs) - -link_directories(${LIBS_DIR}/${CMAKE_ANDROID_ARCH_ABI}) -include_directories(${LIBS_DIR}/${CMAKE_ANDROID_ARCH_ABI}) - -file(GLOB_RECURSE SRCS *.cpp) -file(GLOB_RECURSE HDRS *.h) - -add_library(geomag SHARED ${SRCS} ${HDRS}) - -find_library(log-lib log) -target_link_libraries(geomag PUBLIC igrf wmm ${log-lib}) diff --git a/app/src/main/cpp/geomag.cpp b/app/src/main/cpp/geomag.cpp deleted file mode 100644 index ef398bc..0000000 --- a/app/src/main/cpp/geomag.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include -#include "geomag.h" -#include "libwmm.h" - -namespace GEOMAG { - jobject toMagneticField(JNIEnv *env, MagneticField values) { - jclass mf_clazz = (*env).FindClass("com/sanmer/geomag/model/MagneticField"); - jmethodID mf_init = (*env).GetMethodID(mf_clazz, "", "(DDDDDDDDDDDDDD)V"); - jobject mf_object = (*env).NewObject(mf_clazz, mf_init, - values.Declination, values.DeclinationSV, - values.Inclination, values.InclinationSV, - values.HorizontalIntensity, values.HorizontalSV, - values.NorthComponent, values.NorthSV, - values.EastComponent, values.EastSV, - values.VerticalComponent, values.VerticalSV, - values.TotalIntensity, values.TotalSV - ); - - return mf_object; - } - - double getDecimalYears(int year, int month, int day, int hour, int min, int sec) { - return toDecimalYears(year, month, day, hour, min, sec); - } -} - -extern "C" -JNIEXPORT jdouble JNICALL -Java_com_sanmer_geomag_Geomag_toDecimalYears(JNIEnv *env, jobject thiz, jint year, - jint month, jint day, jint hour, jint min, - jint sec) { - return GEOMAG::getDecimalYears(year, month, day, hour, min, sec); -} \ No newline at end of file diff --git a/app/src/main/cpp/geomag.h b/app/src/main/cpp/geomag.h deleted file mode 100644 index e85391a..0000000 --- a/app/src/main/cpp/geomag.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef GEOMAG_H -#define GEOMAG_H - -struct MagneticField { - double Declination, DeclinationSV; - double Inclination, InclinationSV; - double HorizontalIntensity, HorizontalSV; - double NorthComponent, NorthSV; - double EastComponent, EastSV; - double VerticalComponent, VerticalSV ; - double TotalIntensity, TotalSV; -}; - -namespace GEOMAG { - double getDecimalYears(int year, int month, int day, int hour, int min, int sec); - jobject toMagneticField(JNIEnv *env, MagneticField values); -} - -#endif //GEOMAG_H diff --git a/app/src/main/cpp/igrf-jni.cpp b/app/src/main/cpp/igrf-jni.cpp deleted file mode 100644 index 2027197..0000000 --- a/app/src/main/cpp/igrf-jni.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include -#include "geomag.h" -#include "libigrf.h" -#include "logging.h" - -MagneticField igrf(double lat, double lon, double alt, double decimal_years) { - double *values = IGRF(lat, lon, alt, decimal_years); - - MagneticField results = {}; - MagneticField* results_t = &results; - - double *item = &results_t -> Declination; - for (int i = 0; i < 14; i++) { - (*item++) = values[i]; - } - - return results; -} - -extern "C" -JNIEXPORT jobject JNICALL -Java_com_sanmer_geomag_Geomag_igrf(JNIEnv *env, jobject thiz, jdouble latitude, - jdouble longitude, jdouble alt_km) { - jclass cls = (*env).GetObjectClass(thiz); - jfieldID dy_id = (*env).GetStaticFieldID(cls, "decimalYears", "D"); - jdouble dy = (*env).GetStaticDoubleField(cls, dy_id); - - LOGD("IGRF lat=%f, lon=%f, alt_km=%f, date=%f", latitude, longitude, alt_km, dy); - MagneticField values = igrf(latitude, longitude, alt_km, dy); - return GEOMAG::toMagneticField(env, values); -} \ No newline at end of file diff --git a/app/src/main/cpp/logging.h b/app/src/main/cpp/logging.h deleted file mode 100644 index 6b44552..0000000 --- a/app/src/main/cpp/logging.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef _LOGGING_H -#define _LOGGING_H - -#include - -#define LOG_TAG "Geomag" - -#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__) -#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) -#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) -#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__) -#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) - -#endif // _LOGGING_H diff --git a/app/src/main/cpp/wmm-jni.cpp b/app/src/main/cpp/wmm-jni.cpp deleted file mode 100644 index 6489701..0000000 --- a/app/src/main/cpp/wmm-jni.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include -#include -#include "geomag.h" -#include "libwmm.h" -#include "logging.h" - -MagneticField wmm(double lat, double lon, double alt, double decimal_years) { - double *values = WMM(lat, lon, alt, decimal_years); - - MagneticField results = {}; - MagneticField* results_t = &results; - - double *item = &results_t -> Declination; - for (int i = 0; i < 14; i++) { - double value = values[i]; - if (isnan(value)) { - (*item++) = 0.0; - } else { - (*item++) = value; - } - } - - return results; -} - -extern "C" -JNIEXPORT jobject JNICALL -Java_com_sanmer_geomag_Geomag_wmm(JNIEnv *env, jobject thiz, jdouble latitude, - jdouble longitude, jdouble alt_km) { - jclass cls = (*env).GetObjectClass(thiz); - jfieldID dy_id = (*env).GetStaticFieldID(cls, "decimalYears", "D"); - jdouble dy = (*env).GetStaticDoubleField(cls, dy_id); - - LOGD("WMM lat=%f, lon=%f, alt_km=%f, date=%f", latitude, longitude, alt_km, dy); - MagneticField values = wmm(latitude, longitude, alt_km, dy); - return GEOMAG::toMagneticField(env, values); -} \ No newline at end of file diff --git a/app/src/main/golang/Geomag.go b/app/src/main/golang/Geomag.go new file mode 100644 index 0000000..3e21b1d --- /dev/null +++ b/app/src/main/golang/Geomag.go @@ -0,0 +1,67 @@ +package geomag + +//go:generate bash -c "if [ ! -d libs ]; then mkdir libs; fi" +//go:generate gomobile bind -target android -androidapi 26 -javapkg go -trimpath -v -o libs/geomag.aar + +import ( + "github.com/proway2/go-igrf/igrf" + "github.com/westphae/geomag/pkg/egm96" + "github.com/westphae/geomag/pkg/wmm" + "time" +) + +//export igrf +func IGRF(lat, lon, alt, date float64) *MagneticField { + data := igrf.New() + mag, _ := data.IGRF(lat, lon, alt, date) + + return newMagneticField( + mag.Declination, + mag.DeclinationSV, + mag.Inclination, + mag.InclinationSV, + mag.HorizontalIntensity, + mag.HorizontalSV, + mag.NorthComponent, + mag.NorthSV, + mag.EastComponent, + mag.EastSV, + mag.VerticalComponent, + mag.VerticalSV, + mag.TotalIntensity, + mag.TotalSV, + ) +} + +//export wmm +func WMM(lat, lon, alt, date float64) *MagneticField { + tt := wmm.DecimalYear(date) + loc := egm96.NewLocationGeodetic(lat, lon, alt) + mag, _ := wmm.CalculateWMMMagneticField(loc, tt.ToTime()) + x, y, z, dx, dy, dz := mag.Ellipsoidal() + + return newMagneticField( + mag.D(), + mag.DD(), + mag.I(), + mag.DI(), + mag.H(), + mag.DH(), + x, + dx, + y, + dy, + z, + dz, + mag.F(), + mag.DF(), + ) +} + +//export toDecimalYears +func ToDecimalYears(year, month, day, hour, min, sec, nsec int) float64 { + dateTime := time.Date(year, time.Month(month), day, + hour, min, sec, nsec, time.UTC) + + return float64(wmm.TimeToDecimalYears(dateTime)) +} diff --git a/app/src/main/golang/MagneticField.go b/app/src/main/golang/MagneticField.go new file mode 100644 index 0000000..c536488 --- /dev/null +++ b/app/src/main/golang/MagneticField.go @@ -0,0 +1,45 @@ +package geomag + +type MagneticField struct { + Declination float64 + DeclinationSV float64 + Inclination float64 + InclinationSV float64 + HorizontalIntensity float64 + HorizontalSV float64 + NorthComponent float64 + NorthSV float64 + EastComponent float64 + EastSV float64 + VerticalComponent float64 + VerticalSV float64 + TotalIntensity float64 + TotalSV float64 +} + +func newMagneticField( + declination, declinationSV, + inclination, inclinationSV, + horizontalIntensity, horizontalSV, + northComponent, northSV, + eastComponent, eastSV, + verticalComponent, verticalSV, + totalIntensity, totalSV float64, +) *MagneticField { + return &MagneticField{ + Declination: declination, + DeclinationSV: declinationSV, + Inclination: inclination, + InclinationSV: inclinationSV, + HorizontalIntensity: horizontalIntensity, + HorizontalSV: horizontalSV, + NorthComponent: northComponent, + NorthSV: northSV, + EastComponent: eastComponent, + EastSV: eastSV, + VerticalComponent: verticalComponent, + VerticalSV: verticalSV, + TotalIntensity: totalIntensity, + TotalSV: totalSV, + } +} diff --git a/app/src/main/golang/build.py b/app/src/main/golang/build.py deleted file mode 100755 index 56e8043..0000000 --- a/app/src/main/golang/build.py +++ /dev/null @@ -1,228 +0,0 @@ -#!/usr/bin/env python3 - -import os -import platform -import subprocess -import argparse -from pathlib import Path - - -def parse_parameters(): - parser = argparse.ArgumentParser() - - parser.add_argument("-v", - dest="ndk_version", - metavar="NDK version", - type=str, - default="25.2.9519653", - help="default: {0}".format('%(default)s')) - parser.add_argument("-m", - dest="min_sdk", - metavar="Min SDK version", - type=int, - default=26, - help="default: {0}".format('%(default)s')) - parser.add_argument("-a", - dest="abi_filters", - metavar="ABI", - nargs="+", - default=[], - help="arm64-v8a, armeabi-v7a, x86, x86_64 or all") - parser.add_argument("-d", - "--debug", - action="store_true", - help="enable debug mode to output compilation log") - return parser - - -class BuildTask: - def __init__(self, ndk_directory: Path, work_directory: Path, output_directory: Path, - abi_filters: list, package_names: list, library_names: list, sdk_version: int): - self._ndk_directory = ndk_directory - self._work_directory = work_directory - self._output_directory = output_directory - - self._abi_filters = abi_filters - self._package_names = package_names - self._library_names = library_names - - self._sdk_version = sdk_version - - self.is_debug = False - - @staticmethod - def is_windows_x86_64() -> bool: - if platform.system() == "Windows": - if platform.machine() == "x86_64": - return True - - return False - - @staticmethod - def is_darwin_x86_64() -> bool: - if platform.system() == "Darwin": - if platform.machine() == "x86_64": - return True - - return False - - @staticmethod - def is_linux_x86_64() -> bool: - if platform.system() == "Linux": - if platform.machine() == "x86_64": - return True - - return False - - def setup(self): - subprocess.run( - args=["go", "mod", "tidy"], - cwd=self._work_directory.as_posix() - ) - - def build_environment(self, abi: str) -> dict: - toolchains_root = self._ndk_directory.absolute() - toolchains_root = toolchains_root.joinpath("toolchains", "llvm", "prebuilt") - - if self.is_darwin_x86_64(): - toolchains_root = toolchains_root.joinpath("darwin-x86_64") - elif self.is_linux_x86_64(): - toolchains_root = toolchains_root.joinpath("linux-x86_64") - elif self.is_windows_x86_64(): - toolchains_root = toolchains_root.joinpath("windows-x86_64") - else: - raise OSError(f"Unsupported platform: {platform.system()}-{platform.machine()}") - - toolchains_root = toolchains_root.joinpath("bin") - - match abi: - case "arm64-v8a": - compiler_prefix = "aarch64-linux-android" - go_arch = "arm64" - go_arm = "" - case "armeabi-v7a": - compiler_prefix = "armv7a-linux-androideabi" - go_arch = "arm" - go_arm = "7" - case "x86": - compiler_prefix = "i686-linux-android" - go_arch = "386" - go_arm = "" - case "x86_64": - compiler_prefix = "x86_64-linux-android" - go_arch = "amd64" - go_arm = "" - case _: - raise ValueError(f"Unsupported abi: {abi}") - - toolchains_root = toolchains_root.joinpath(f"{compiler_prefix}{self._sdk_version}-clang") - - environment = dict() - environment["CC"] = toolchains_root.as_posix() - environment["GOOS"] = "android" - environment["GOARCH"] = go_arch - environment["GOARM"] = go_arm - environment["CGO_ENABLED"] = "1" - environment["CFLAGS"] = "-O3 -Werror" - - return environment - - def build(self, package_name: str, library_name: str, abi: str): - commands = list() - commands.append("go") - commands.append("build") - - if self.is_debug: - commands.append("-x") - - commands.append("-trimpath") - commands.append("-buildmode") - commands.append("c-shared") - commands.append("-o") - - commands.append(self._output_directory.joinpath(abi, f"lib{library_name}.so").as_posix()) - - commands.append("-ldflags") - commands.append("-s -w") - - commands.append(package_name) - - print(f"> Task :{library_name}:configureEnvironment[{abi}]") - os.environ.update(self.build_environment(abi)) - - print(f"> Task :{library_name}:buildLibrary[{abi}]") - subprocess.run( - args=commands, - cwd=self._work_directory.as_posix() - ) - - def task(self): - for abi in self._abi_filters: - for i in range(0, len(self._package_names)): - package_name = self._package_names[i] - library_name = self._library_names[i] - - self.build( - package_name=package_name, - library_name=library_name, - abi=abi - ) - - -def get_env(key: str): - try: - value = os.environ[key] - except KeyError: - value = None - - return value - - -def main(): - parser = parse_parameters() - args = parser.parse_args() - - ndk_version = args.ndk_version - sdk_version = args.min_sdk - - if len(args.abi_filters) == 0: - parser.print_help() - - if "all" in args.abi_filters: - abi_filters = ["arm64-v8a", "armeabi-v7a", "x86", "x86_64"] - else: - abi_filters = args.abi_filters - - # libs - package_names = ["geomag/igrf", "geomag/wmm"] - library_names = ["igrf", "wmm"] - - # dirs - sdk_dir = get_env("ANDROID_SDK_ROOT") - if sdk_dir is None: - ndk_dir = get_env("ANDROID_NDK_ROOT") - if ndk_dir is None: - raise KeyError("ANDROID_SDK_ROOT or ANDROID_NDK_ROOT does not exist in env") - - ndk_directory = Path(ndk_dir) - else: - ndk_directory = Path(sdk_dir, "ndk", ndk_version) - - root_directory = Path(__file__).resolve().parent - - build = BuildTask( - abi_filters=abi_filters, - package_names=package_names, - library_names=library_names, - sdk_version=sdk_version, - ndk_directory=ndk_directory, - work_directory=root_directory, - output_directory=root_directory.joinpath("libs") - ) - build.is_debug = args.debug - build.setup() - build.task() - - -if __name__ == "__main__": - main() diff --git a/app/src/main/golang/go.mod b/app/src/main/golang/go.mod index ad25f91..42e2640 100644 --- a/app/src/main/golang/go.mod +++ b/app/src/main/golang/go.mod @@ -6,3 +6,10 @@ require ( github.com/proway2/go-igrf v0.5.1 github.com/westphae/geomag v1.0.2 ) + +require ( + golang.org/x/mobile v0.0.0-20230531173138-3c911d8e3eda // indirect + golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect + golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f // indirect + golang.org/x/tools v0.1.12 // indirect +) diff --git a/app/src/main/golang/go.sum b/app/src/main/golang/go.sum index bcc6898..e61f4b1 100644 --- a/app/src/main/golang/go.sum +++ b/app/src/main/golang/go.sum @@ -2,3 +2,11 @@ github.com/proway2/go-igrf v0.5.1 h1:GLxkN5hHGJHoAVfrkFHgJ8SfKKCTzGWHg3aZweX1lwc github.com/proway2/go-igrf v0.5.1/go.mod h1:nkA3o+7eci3SXLj0nx2yi14e9Td+AAwHFdglavT+oZI= github.com/westphae/geomag v1.0.2 h1:dpcizAXfjKV0PR6ohY7PX3hHfiIPVjJC03M8KyJjqRI= github.com/westphae/geomag v1.0.2/go.mod h1:xOwtBFVzYXv+tutDPYOuV3PSwS1f9hHuGQsPAUzVYf8= +golang.org/x/mobile v0.0.0-20230531173138-3c911d8e3eda h1:O+EUvnBNPwI4eLthn8W5K+cS8zQZfgTABPLNm6Bna34= +golang.org/x/mobile v0.0.0-20230531173138-3c911d8e3eda/go.mod h1:aAjjkJNdrh3PMckS4B10TGS2nag27cbKR1y2BpUxsiY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= diff --git a/app/src/main/golang/igrf/main.go b/app/src/main/golang/igrf/main.go deleted file mode 100644 index bbc56e6..0000000 --- a/app/src/main/golang/igrf/main.go +++ /dev/null @@ -1,27 +0,0 @@ -package main - -import ( - "C" - "github.com/proway2/go-igrf/igrf" - "reflect" - "unsafe" -) - -//export IGRF -func IGRF(lat, lon, alt, date C.double) *C.double { - size := 14 - p := C.malloc(C.size_t(size) * C.size_t(unsafe.Sizeof(C.double(0)))) - out := (*[14]C.double)(p) - - data := igrf.New() - res, _ := data.IGRF(float64(lat), float64(lon), float64(alt), float64(date)) - values := reflect.ValueOf(res) - for i := 0; i < 14; i++ { - v := values.Field(i).Float() - out[i] = C.double(v) - } - - return (*C.double)(p) -} - -func main() {} diff --git a/app/src/main/golang/wmm/main.go b/app/src/main/golang/wmm/main.go deleted file mode 100644 index d0ddfc1..0000000 --- a/app/src/main/golang/wmm/main.go +++ /dev/null @@ -1,55 +0,0 @@ -package main - -import "C" -import ( - "github.com/westphae/geomag/pkg/egm96" - "github.com/westphae/geomag/pkg/wmm" - "time" - "unsafe" -) - -//export WMM -func WMM(lat, lon, alt, date C.double) *C.double { - size := 14 - p := C.malloc(C.size_t(size) * C.size_t(unsafe.Sizeof(C.double(0)))) - out := (*[14]C.double)(p) - - tt := wmm.DecimalYear(float64(date)) - loc := egm96.NewLocationGeodetic(float64(lat), float64(lon), float64(alt)) - mag, _ := wmm.CalculateWMMMagneticField(loc, tt.ToTime()) - - x, y, z, dx, dy, dz := mag.Ellipsoidal() - - out[0] = C.double(mag.D()) - out[1] = C.double(mag.DD()) - out[2] = C.double(mag.I()) - out[3] = C.double(mag.DI()) - - out[4] = C.double(mag.H()) - out[5] = C.double(mag.DH()) - - out[6] = C.double(x) - out[7] = C.double(dx) - out[8] = C.double(y) - out[9] = C.double(dy) - out[10] = C.double(z) - out[11] = C.double(dz) - - out[12] = C.double(mag.F()) - out[13] = C.double(mag.DF()) - - return (*C.double)(p) -} - -//export toDecimalYears -func toDecimalYears(year, month, day, hour, min, sec C.int) C.double { - dateTime := time.Date( - int(year), time.Month(int(month)), int(day), - int(hour), int(min), int(sec), 0, time.UTC) - - decimalYears := wmm.TimeToDecimalYears(dateTime) - - return C.double(decimalYears) -} - -func main() {} diff --git a/app/src/main/kotlin/com/sanmer/geomag/Geomag.kt b/app/src/main/kotlin/com/sanmer/geomag/Geomag.kt index 0892b24..27333db 100644 --- a/app/src/main/kotlin/com/sanmer/geomag/Geomag.kt +++ b/app/src/main/kotlin/com/sanmer/geomag/Geomag.kt @@ -1,54 +1,76 @@ package com.sanmer.geomag -import androidx.annotation.Keep import com.sanmer.geomag.model.MagneticField import com.sanmer.geomag.model.Position import com.sanmer.geomag.model.Record +import com.sanmer.geomag.model.toField import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import kotlinx.datetime.LocalDateTime +import go.geomag.Geomag as GoGeomag object Geomag { - @Keep - var decimalYears = 2020.0 - - init { - System.loadLibrary("geomag") - } - - private external fun toDecimalYears( + private fun toDecimalYears( year: Int, month: Int, day: Int, hour: Int, min: Int, sec: Int - ) : Double + ) = GoGeomag.toDecimalYears( + year.toLong(), + month.toLong(), + day.toLong(), + hour.toLong(), + min.toLong(), + sec.toLong(), + 0L + ) + + private fun igrf( + latitude: Double, + longitude: Double, + altKm: Double, + decimalYears: Double + ) = GoGeomag.igrf( + latitude, + longitude, + altKm, + decimalYears + ) + + private fun wmm( + latitude: Double, + longitude: Double, + altKm: Double, + decimalYears: Double + ) = GoGeomag.wmm( + latitude, + longitude, + altKm, + decimalYears + ) fun toDecimalYears(dateTime: LocalDateTime) = toDecimalYears( dateTime.year, dateTime.monthNumber, dateTime.dayOfMonth, dateTime.hour, dateTime.minute, dateTime.second ) - external fun igrf( - latitude: Double, longitude: Double, altKm :Double - ): MagneticField - - external fun wmm( - latitude: Double, longitude: Double, altKm :Double - ): MagneticField - fun igrf( dataTime: LocalDateTime, position: Position - ): MagneticField { + ) = igrf( + latitude = position.latitude, + longitude = position.longitude, + altKm = position.altitude, decimalYears = toDecimalYears(dataTime) - return igrf(position.latitude, position.longitude, position.altitude) - } + ).toField() fun wmm( dataTime: LocalDateTime, position: Position - ): MagneticField { + ) = wmm( + latitude = position.latitude, + longitude = position.longitude, + altKm = position.altitude, decimalYears = toDecimalYears(dataTime) - return wmm(position.latitude, position.longitude, position.altitude) - } + ).toField() suspend fun run( model: Models, diff --git a/app/src/main/kotlin/com/sanmer/geomag/model/MagneticField.kt b/app/src/main/kotlin/com/sanmer/geomag/model/MagneticField.kt index 379754a..1d3be24 100644 --- a/app/src/main/kotlin/com/sanmer/geomag/model/MagneticField.kt +++ b/app/src/main/kotlin/com/sanmer/geomag/model/MagneticField.kt @@ -1,5 +1,7 @@ package com.sanmer.geomag.model +import go.geomag.MagneticField as GoMagneticField + data class MagneticField( val declination: Double, val declinationSV: Double, @@ -28,3 +30,20 @@ data class MagneticField( ) } } + +fun GoMagneticField.toField() = MagneticField( + declination = declination, + declinationSV = declinationSV, + inclination = inclination, + inclinationSV = inclinationSV, + horizontalIntensity = horizontalIntensity, + horizontalSV = horizontalSV, + northComponent = northComponent, + northSV = northSV, + eastComponent = eastComponent, + eastSV = eastSV, + verticalComponent = verticalComponent, + verticalSV = verticalSV, + totalIntensity = totalIntensity, + totalSV = totalSV +)