diff --git a/FCLauncher/src/main/java/com/tungsten/fclauncher/bridge/FCLBridge.java b/FCLauncher/src/main/java/com/tungsten/fclauncher/bridge/FCLBridge.java index 370e267c..7fef94ff 100644 --- a/FCLauncher/src/main/java/com/tungsten/fclauncher/bridge/FCLBridge.java +++ b/FCLauncher/src/main/java/com/tungsten/fclauncher/bridge/FCLBridge.java @@ -186,11 +186,10 @@ public class FCLBridge implements Serializable { try { Intent intent = new Intent(Intent.ACTION_VIEW); String targetLink = link; - if (targetLink.startsWith("file:")) { + if (targetLink.startsWith("file://")) { + targetLink = targetLink.replace("file://",""); + } else if (targetLink.startsWith("file:")){ targetLink = targetLink.replace("file:",""); - if (targetLink.startsWith("//")) { - targetLink = targetLink.replace("//","/"); - } } intent.setDataAndType(Uri.parse(targetLink), "*/*"); context.startActivity(intent); diff --git a/FCLauncher/src/main/jni/lwjgl3/fcl_hook.c b/FCLauncher/src/main/jni/lwjgl3/fcl_hook.c index 40f5bb26..189ce0e9 100644 --- a/FCLauncher/src/main/jni/lwjgl3/fcl_hook.c +++ b/FCLauncher/src/main/jni/lwjgl3/fcl_hook.c @@ -9,24 +9,47 @@ #include #include "fcl/include/fcl_internal.h" -jint (*orig_ProcessImpl_forkAndExec)(JNIEnv *env, jobject process, jint mode, jbyteArray helperpath, jbyteArray prog, jbyteArray argBlock, jint argc, jbyteArray envBlock, jint envc, jbyteArray dir, jintArray std_fds, jboolean redirectErrorStream); +jint (*orig_ProcessImpl_forkAndExec)(JNIEnv *env, jobject process, jint mode, jbyteArray helperpath, + jbyteArray prog, jbyteArray argBlock, jint argc, + jbyteArray envBlock, jint envc, jbyteArray dir, + jintArray std_fds, jboolean redirectErrorStream); jint -hooked_ProcessImpl_forkAndExec(JNIEnv *env, jobject process, jint mode, jbyteArray helperpath, jbyteArray prog, jbyteArray argBlock, jint argc, jbyteArray envBlock, jint envc, jbyteArray dir, jintArray std_fds, jboolean redirectErrorStream) { - char *pProg = (char *)((*env)->GetByteArrayElements(env, prog, NULL)); +hooked_ProcessImpl_forkAndExec(JNIEnv *env, jobject process, jint mode, jbyteArray helperpath, + jbyteArray prog, jbyteArray argBlock, jint argc, jbyteArray envBlock, + jint envc, jbyteArray dir, jintArray std_fds, + jboolean redirectErrorStream) { + char *pProg = (char *) ((*env)->GetByteArrayElements(env, prog, NULL)); if (strcmp(basename(pProg), "xdg-open") != 0) { - (*env)->ReleaseByteArrayElements(env, prog, (jbyte *)pProg, 0); - return orig_ProcessImpl_forkAndExec(env, process, mode, helperpath, prog, argBlock, argc, envBlock, envc, dir, std_fds, redirectErrorStream); + (*env)->ReleaseByteArrayElements(env, prog, (jbyte *) pProg, 0); + return orig_ProcessImpl_forkAndExec(env, process, mode, helperpath, prog, argBlock, argc, + envBlock, envc, dir, std_fds, redirectErrorStream); } - (*env)->ReleaseByteArrayElements(env, prog, (jbyte *)pProg, 0); + (*env)->ReleaseByteArrayElements(env, prog, (jbyte *) pProg, 0); - long len = (*env)->GetArrayLength(env,argBlock); - unsigned char* cs[len]; - (*env)->GetByteArrayRegion(env,argBlock, 0, len, (jbyte *)cs); - (*env)->DeleteLocalRef(env,argBlock); + long len = (*env)->GetArrayLength(env, argBlock); + const char *cs[len]; + (*env)->GetByteArrayRegion(env, argBlock, 0, len, (jbyte *) cs); + (*env)->DeleteLocalRef(env, argBlock); + + FCL_INTERNAL_LOG("forkAndExec:%s", cs); + JavaVM *androidVm = fcl.android_jvm; + JNIEnv *androidEnv = NULL; + char detachable = 0; + if ((*androidVm)->GetEnv(androidVm, (void **) &androidEnv, JNI_VERSION_1_2) == JNI_EDETACHED) { + (*androidVm)->AttachCurrentThread(androidVm, &androidEnv, NULL); + detachable = 1; + } + if (!androidEnv){ + FCL_INTERNAL_LOG("forkAndExec error:androidEnv in null"); + } + jmethodID method_OpenLink = (*androidEnv)->GetStaticMethodID(androidEnv, fcl.class_FCLBridge, "openLink", + "(Ljava/lang/String;)V"); + (*androidEnv)->CallStaticVoidMethod(androidEnv, fcl.class_FCLBridge, method_OpenLink, + (*androidEnv)->NewStringUTF(androidEnv, cs)); + if (detachable) (*androidVm)->DetachCurrentThread(androidVm); - FCL_INTERNAL_LOG("forkAndExec:%s",cs); return 0; } @@ -34,14 +57,15 @@ void hookExec(JNIEnv *env) { jclass cls; orig_ProcessImpl_forkAndExec = dlsym(RTLD_DEFAULT, "Java_java_lang_UNIXProcess_forkAndExec"); if (!orig_ProcessImpl_forkAndExec) { - orig_ProcessImpl_forkAndExec = dlsym(RTLD_DEFAULT, "Java_java_lang_ProcessImpl_forkAndExec"); + orig_ProcessImpl_forkAndExec = dlsym(RTLD_DEFAULT, + "Java_java_lang_ProcessImpl_forkAndExec"); cls = (*env)->FindClass(env, "java/lang/ProcessImpl"); } else { cls = (*env)->FindClass(env, "java/lang/UNIXProcess"); } JNINativeMethod methods[] = { - {"forkAndExec", "(I[B[B[BI[BI[B[IZ)I", (void *)&hooked_ProcessImpl_forkAndExec} + {"forkAndExec", "(I[B[B[BI[BI[B[IZ)I", (void *) &hooked_ProcessImpl_forkAndExec} }; (*env)->RegisterNatives(env, cls, methods, 1); - printf("Registered forkAndExec\n"); + FCL_INTERNAL_LOG("Registered forkAndExec\n"); }