fix open link for 1.13+
This commit is contained in:
parent
f7800f1950
commit
d00cec4eaa
|
@ -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);
|
||||
|
|
|
@ -9,24 +9,47 @@
|
|||
#include <libgen.h>
|
||||
#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");
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue