/** * @file * * @author Mamadou Babaei * * @section LICENSE * * (The MIT License) * * Copyright (c) 2020 - 2023 SenseGlove * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * * @section DESCRIPTION * * */ #include "SGAndroid/SGConnectJNI.h" #if PLATFORM_ANDROID #include "Android/AndroidApplication.h" #include "Android/AndroidJava.h" #endif /* PLATFORM_ANDROID */ #if PLATFORM_ANDROID #include "SGConnectImpl/SGExportedFunctions.h" #include "SGInterop/SGIC_jclass.h" #include "SGInterop/SGIC_jmethodID.h" #include "SGInterop/SGIC_JNIEnv_Ptr.h" #endif /* PLATFORM_ANDROID */ int32 FSGConnectJNI::Initialize() { int32 Result = -999999; #if PLATFORM_ANDROID static constexpr char SGCONNECT_JAVA_CLASS_NAME[] = "com.senseglove.sgconnect.SGConnect"; SGLOG("FSGCoreJNI: attempting to get the Android JNI environment..."); JNIEnv* Env = FAndroidApplication::GetJavaEnv(); FAndroidApplication::CheckJavaException(); if (!Env) { SGLOG_ERROR("FSGCoreJNI: failed to get the Android JNI environmnet!"); return -1999999; } FSGIC_JNIEnv_Ptr InEnvContainer{Env}; SGLOG("FSGCoreJNI: attempting to find the Android Java class..."); jclass Class = FAndroidApplication::FindJavaClass(SGCONNECT_JAVA_CLASS_NAME); FAndroidApplication::CheckJavaException(); if (Env->IsSameObject(Class, nullptr)) { SGLOG_ERROR("FSGCoreJNI: failed to get the Android Java class!"); return -2999999; } Class = (jclass)Env->NewGlobalRef(Class); FSGIC_jclass InClassContainer{Class}; SGLOG("FSGCoreJNI: attempting to find the Android JNI method 'Init'..."); jmethodID InitMethodID = Env->GetStaticMethodID(Class, "Init", "()I"); FAndroidApplication::CheckJavaException(); if (!InitMethodID) { SGLOG_ERROR("FSGCoreJNI: failed to get the Android JNI method 'Init'!"); return -3999999; } FSGIC_jmethodID InInitMethodIDContainer{InitMethodID}; SGLOG("FSGCoreJNI: attempting to find the Android JNI method 'Dispose'..."); jmethodID DisposeMethodID = Env->GetStaticMethodID(Class, "Dispose", "()I"); FAndroidApplication::CheckJavaException(); if (!DisposeMethodID) { SGLOG_ERROR("FSGCoreJNI: failed to get the Android JNI method 'Dispose'!"); return -4999999; } FSGIC_jmethodID InDisposeMethodIDContainer{DisposeMethodID}; SGLOG("FSGCoreJNI: attempting to find the Android JNI method 'GetLibraryVersion'..."); jmethodID GetLibraryVersionMethodID = Env->GetStaticMethodID(Class, "GetLibraryVersion", "()Ljava/lang/String;"); FAndroidApplication::CheckJavaException(); if (!GetLibraryVersionMethodID) { SGLOG_ERROR("FSGCoreJNI: failed to get the Android JNI method 'GetLibraryVersion'!"); return -5999999; } FSGIC_jmethodID InGetLibraryVersionMethodIDContainer{GetLibraryVersionMethodID}; Result = SGConnectImpl_Android_Initialize(&InEnvContainer, &InClassContainer, &InInitMethodIDContainer, &InDisposeMethodIDContainer, &InGetLibraryVersionMethodIDContainer); #endif /* PLATFORM_ANDROID */ return Result; }