std::string GetAppCachePath() { LogMsg("Getting app cache.."); JNIEnv *env = GetJavaEnv(); if (!env) return ""; //first see if we can access an external storage method jclass cls = env->FindClass(GetAndroidMainClassName()); jmethodID mid = env->GetStaticMethodID(cls, "get_externaldir", "()Ljava/lang/String;"); jstring ret = (jstring)env->CallStaticObjectMethod(cls, mid); const char* ss = env->GetStringUTFChars(ret,0); std::string tmp = ss; env->ReleaseStringUTFChars(ret, ss); std::string retString = std::string(tmp); if (!retString.empty()) { retString += std::string("/Android/data/")+GetBundlePrefix()+GetBundleName()+"/files/"; return retString; } retString = GetSavePathBasic(); return retString; //invalid }
bool IsAppInstalled(std::string packageName) { JNIEnv *env = GetJavaEnv(); if (!env) return false; jclass cls = env->FindClass(GetAndroidMainClassName()); jmethodID mid = env->GetStaticMethodID(cls, "is_app_installed", "(Ljava/lang/String;)I"); return env->CallStaticIntMethod(cls, mid, env->NewStringUTF(packageName.c_str())) != 0; }
void LaunchURL(std::string url) { JNIEnv *env = GetJavaEnv(); LogMsg("Launching %s", url.c_str()); if (!env) return; jclass cls = env->FindClass(GetAndroidMainClassName()); jmethodID mid = env->GetStaticMethodID(cls, "LaunchURL", "(Ljava/lang/String;)V"); env->CallStaticVoidMethod(cls, mid, env->NewStringUTF(url.c_str())); }
void FireAchievement(std::string achievement) { JNIEnv *env = GetJavaEnv(); LogMsg("Attempting to fire Achievement %s", achievement.c_str()); if (!env) return; jclass cls = env->FindClass(GetAndroidMainClassName()); jmethodID mid = env->GetStaticMethodID(cls, "HandleAchievement", "(Ljava/lang/String;)V"); env->CallStaticVoidMethod(cls, mid, env->NewStringUTF(achievement.c_str())); }
jclass FAndroidApplication::FindJavaClass( const char* name ) { JNIEnv* Env = GetJavaEnv(); if (!Env) { return nullptr; } jstring ClassNameObj = Env->NewStringUTF(name); jclass FoundClass = static_cast<jclass>(Env->CallObjectMethod(ClassLoader, FindClassMethod, ClassNameObj)); CheckJavaException(); Env->DeleteLocalRef(ClassNameObj); return FoundClass; }
std::string GetRegionString() { JNIEnv *env = GetJavaEnv(); if (!env) return ""; jclass cls = env->FindClass(GetAndroidMainClassName()); jmethodID mid = env->GetStaticMethodID(cls, "get_region", "()Ljava/lang/String;"); jstring ret; ret = (jstring)env->CallStaticObjectMethod(cls, mid); const char* ss = env->GetStringUTFChars(ret,0); std::string tmp = ss; env->ReleaseStringUTFChars(ret, ss); return std::string(tmp); }
bool FAndroidApplication::CheckJavaException() { JNIEnv* Env = GetJavaEnv(); if (!Env) { return true; } if (Env->ExceptionCheck()) { Env->ExceptionDescribe(); Env->ExceptionClear(); verify(false && "Java JNI call failed with an exception."); return true; } return false; }
void CreateDirectoryRecursively(std::string basePath, std::string path) { #ifdef _DEBUG //LogMsg("CreateDirectoryRecursively: %s, path is %s", basePath.c_str(), path.c_str()); #endif JNIEnv *env = GetJavaEnv(); if (!env) return; jclass cls = env->FindClass(GetAndroidMainClassName()); jmethodID mid = env->GetStaticMethodID(cls, "create_dir_recursively", "(Ljava/lang/String;Ljava/lang/String;)V"); jstring ret; env->CallStaticVoidMethod(cls, mid, env->NewStringUTF(basePath.c_str()), env->NewStringUTF(path.c_str())); return; }
void FAndroidApplication::InitializeJavaEnv( JavaVM* VM, jint Version, jobject GlobalThis ) { if (CurrentJavaVM == nullptr) { CurrentJavaVM = VM; CurrentJavaVersion = Version; JNIEnv* Env = GetJavaEnv(false); jclass MainClass = Env->FindClass("com/epicgames/ue4/GameActivity"); jclass classClass = Env->FindClass("java/lang/Class"); jclass classLoaderClass = Env->FindClass("java/lang/ClassLoader"); jmethodID getClassLoaderMethod = Env->GetMethodID(classClass, "getClassLoader", "()Ljava/lang/ClassLoader;"); jobject classLoader = Env->CallObjectMethod(MainClass, getClassLoaderMethod); ClassLoader = Env->NewGlobalRef(classLoader); FindClassMethod = Env->GetMethodID(classLoaderClass, "findClass", "(Ljava/lang/String;)Ljava/lang/Class;"); } GlobalObjectRef = GlobalThis; }
std::string GetAPKFile() { JNIEnv *env = GetJavaEnv(); if (!env) { LogMsg("GetAPKFile> Error, can't do this yet, no java environment"); return ""; } LogMsg("Getting apk file for %s from the Java side...",GetAndroidMainClassName()); jclass cls = env->FindClass(GetAndroidMainClassName()); jmethodID mid = env->GetStaticMethodID(cls, "get_apkFileName", "()Ljava/lang/String;"); jstring ret; ret = (jstring)env->CallStaticObjectMethod(cls, mid); const char* ss = env->GetStringUTFChars(ret,0); std::string tmp = ss; env->ReleaseStringUTFChars(ret, ss); return std::string(tmp); }