Files
Plugin/Source/SenseGloveAndroid/Private/SGAndroid/SGConnectJNI.cpp
T

215 lines
6.5 KiB
C++

/**
* @file
*
* @author Mamadou Babaei <mamadou@senseglove.com>
*
* @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 */
static constexpr char SGCONNECT_JAVA_CLASS_NAME[] = "com.senseglove.sgconnect.SGConnect";
int32 FSGConnectJNI::Init()
{
int32 Result = -999;
#if PLATFORM_ANDROID
JNIEnv* Env = FAndroidApplication::GetJavaEnv();
if (Env)
{
jclass Class = FAndroidApplication::FindJavaClass(SGCONNECT_JAVA_CLASS_NAME);
if (!Env->IsSameObject(Class, nullptr))
{
jmethodID Method = Env->GetStaticMethodID(Class, "Init", "()I");
if (Method)
{
Result = Env->CallStaticIntMethod(Class, Method);
}
}
}
#endif /* PLATFORM_ANDROID */
return Result;
}
int32 FSGConnectJNI::Dispose()
{
int32 Result = -999;
#if PLATFORM_ANDROID
JNIEnv* Env = FAndroidApplication::GetJavaEnv();
if (Env)
{
jclass Class = FAndroidApplication::FindJavaClass(SGCONNECT_JAVA_CLASS_NAME);
if (!Env->IsSameObject(Class, nullptr))
{
jmethodID Method = Env->GetStaticMethodID(Class, "Dispose", "()I");
if (Method)
{
Result = Env->CallStaticIntMethod(Class, Method);
}
}
}
#endif /* PLATFORM_ANDROID */
return Result;
}
FString FSGConnectJNI::GetLibraryVersion()
{
FString Result;
#if PLATFORM_ANDROID
JNIEnv* Env = FAndroidApplication::GetJavaEnv();
if (Env)
{
jclass Class = FAndroidApplication::FindJavaClass(SGCONNECT_JAVA_CLASS_NAME);
if (!Env->IsSameObject(Class, nullptr))
{
jmethodID Method = Env->GetStaticMethodID(Class, "GetLibraryVersion", "()Ljava/lang/String;");
if (Method)
{
jstring ResultJString = (jstring)Env->CallStaticObjectMethod(Class, Method);
const char* ResultChars = Env->GetStringUTFChars(ResultJString, nullptr);
Result = FString(UTF8_TO_TCHAR(ResultChars));
Env->ReleaseStringUTFChars(ResultJString, ResultChars);
}
}
}
#endif /* PLATFORM_ANDROID */
return Result;
}
int32 FSGConnectJNI::ActiveDevices()
{
int32 Result = -999;
#if PLATFORM_ANDROID
JNIEnv* Env = FAndroidApplication::GetJavaEnv();
if (Env)
{
jclass Class = FAndroidApplication::FindJavaClass(SGCONNECT_JAVA_CLASS_NAME);
if (!Env->IsSameObject(Class, nullptr))
{
jmethodID Method = Env->GetStaticMethodID(Class, "ActiveDevices", "()I");
if (Method)
{
Result = Env->CallStaticIntMethod(Class, Method);
}
}
}
#endif /* PLATFORM_ANDROID */
return Result;
}
FString FSGConnectJNI::GetDeviceString(const int32 DeviceAddress)
{
FString Result;
#if PLATFORM_ANDROID
JNIEnv* Env = FAndroidApplication::GetJavaEnv();
if (Env)
{
jclass Class = FAndroidApplication::FindJavaClass(SGCONNECT_JAVA_CLASS_NAME);
if (!Env->IsSameObject(Class, nullptr))
{
jmethodID Method = Env->GetStaticMethodID(Class, "GetDeviceString", "(I)Ljava/lang/String;");
if (Method)
{
jstring ResultJString = (jstring)Env->CallStaticObjectMethod(Class, Method, DeviceAddress);
const char* ResultChars = Env->GetStringUTFChars(ResultJString, nullptr);
Result = FString(UTF8_TO_TCHAR(ResultChars));
Env->ReleaseStringUTFChars(ResultJString, ResultChars);
}
}
}
#endif /* PLATFORM_ANDROID */
return Result;
}
FString FSGConnectJNI::GetSensorString(const int32 DeviceAddress)
{
FString Result;
#if PLATFORM_ANDROID
JNIEnv* Env = FAndroidApplication::GetJavaEnv();
if (Env)
{
jclass Class = FAndroidApplication::FindJavaClass(SGCONNECT_JAVA_CLASS_NAME);
if (!Env->IsSameObject(Class, nullptr))
{
jmethodID Method = Env->GetStaticMethodID(Class, "GetSensorString", "(I)Ljava/lang/String;");
if (Method)
{
jstring ResultJString = (jstring)Env->CallStaticObjectMethod(Class, Method, DeviceAddress);
const char* ResultChars = Env->GetStringUTFChars(ResultJString, nullptr);
Result = FString(UTF8_TO_TCHAR(ResultChars));
Env->ReleaseStringUTFChars(ResultJString, ResultChars);
}
}
}
#endif /* PLATFORM_ANDROID */
return Result;
}
int32 FSGConnectJNI::WriteHaptics(const int32 DeviceAddress, const FString& Haptics)
{
int32 Result = -999;
#if PLATFORM_ANDROID
JNIEnv* Env = FAndroidApplication::GetJavaEnv();
if (Env)
{
jclass Class = FAndroidApplication::FindJavaClass(SGCONNECT_JAVA_CLASS_NAME);
if (!Env->IsSameObject(Class, nullptr))
{
jmethodID Method = Env->GetStaticMethodID(Class, "ActiveDevices", "(ILjava/lang/String;)I");
if (Method)
{
jstring HapticsString = Env->NewStringUTF(TCHAR_TO_UTF8(*Haptics));
Result = Env->CallStaticIntMethod(Class, Method, HapticsString, DeviceAddress, HapticsString);
Env->DeleteLocalRef(HapticsJString);
}
}
}
#endif /* PLATFORM_ANDROID */
return Result;
}