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 {
|
try {
|
||||||
Intent intent = new Intent(Intent.ACTION_VIEW);
|
Intent intent = new Intent(Intent.ACTION_VIEW);
|
||||||
String targetLink = link;
|
String targetLink = link;
|
||||||
if (targetLink.startsWith("file:")) {
|
if (targetLink.startsWith("file://")) {
|
||||||
|
targetLink = targetLink.replace("file://","");
|
||||||
|
} else if (targetLink.startsWith("file:")){
|
||||||
targetLink = targetLink.replace("file:","");
|
targetLink = targetLink.replace("file:","");
|
||||||
if (targetLink.startsWith("//")) {
|
|
||||||
targetLink = targetLink.replace("//","/");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
intent.setDataAndType(Uri.parse(targetLink), "*/*");
|
intent.setDataAndType(Uri.parse(targetLink), "*/*");
|
||||||
context.startActivity(intent);
|
context.startActivity(intent);
|
||||||
|
|
|
@ -9,24 +9,47 @@
|
||||||
#include <libgen.h>
|
#include <libgen.h>
|
||||||
#include "fcl/include/fcl_internal.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
|
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) {
|
hooked_ProcessImpl_forkAndExec(JNIEnv *env, jobject process, jint mode, jbyteArray helperpath,
|
||||||
char *pProg = (char *)((*env)->GetByteArrayElements(env, prog, NULL));
|
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) {
|
if (strcmp(basename(pProg), "xdg-open") != 0) {
|
||||||
(*env)->ReleaseByteArrayElements(env, prog, (jbyte *)pProg, 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);
|
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);
|
long len = (*env)->GetArrayLength(env, argBlock);
|
||||||
unsigned char* cs[len];
|
const char *cs[len];
|
||||||
(*env)->GetByteArrayRegion(env,argBlock, 0, len, (jbyte *)cs);
|
(*env)->GetByteArrayRegion(env, argBlock, 0, len, (jbyte *) cs);
|
||||||
(*env)->DeleteLocalRef(env,argBlock);
|
(*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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,14 +57,15 @@ void hookExec(JNIEnv *env) {
|
||||||
jclass cls;
|
jclass cls;
|
||||||
orig_ProcessImpl_forkAndExec = dlsym(RTLD_DEFAULT, "Java_java_lang_UNIXProcess_forkAndExec");
|
orig_ProcessImpl_forkAndExec = dlsym(RTLD_DEFAULT, "Java_java_lang_UNIXProcess_forkAndExec");
|
||||||
if (!orig_ProcessImpl_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");
|
cls = (*env)->FindClass(env, "java/lang/ProcessImpl");
|
||||||
} else {
|
} else {
|
||||||
cls = (*env)->FindClass(env, "java/lang/UNIXProcess");
|
cls = (*env)->FindClass(env, "java/lang/UNIXProcess");
|
||||||
}
|
}
|
||||||
JNINativeMethod methods[] = {
|
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);
|
(*env)->RegisterNatives(env, cls, methods, 1);
|
||||||
printf("Registered forkAndExec\n");
|
FCL_INTERNAL_LOG("Registered forkAndExec\n");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue