Android通过JNI实现守护进程与卸载后跳转指定网页
JNI进程守护 c代码部分如下:
JNIEXPORT void JNICALL Java_com_sharetimes_qude_jni_JNIDaemon_daemon(JNIEnv * env, jobject obj,jstring packageDir,jint sdkVersion,jstring user) {
char * pd = Jstring2CStr(env, packageDir);
pid_t pid = fork();
if (pid < ) {
LOGD("create process failure");
exit();
} else if (pid > ) {
//pid_r=wait(NULL);
} else {
while (JNI_TRUE) {
pid_t sid_r,sid;
sid = fork();
//创建捕捉子进程退出信号
if(sid == ) {
LOGD("app run create");
if (sdkVersion >= ) {
execlp("am", "am", "startservice", "--user","", "-n","com.sharetimes.qude/.service.StartService", (char*) );
}
else {
execlp("am", "am", "startservice", "-n","com.sharetimes.qude/.service.StartService", (char*) );
}
sleep(); //等待子线程
} else if(sid<) {
exit();
} else {
LOGD("app run clear");
sid_r = wait(NULL);
}
FILE* file = fopen(pd, "rt");
if(file == NULL) {
LOGD("app run daemon exit");
exit();
}
fclose(file);
if(file != NULL) {
free(file);
file==NULL;
}
sleep();
}
}
}
Java代码调用
public class JNIDaemon { public native void daemon(String packageDir, int sdkVersion, String user); public void init(Context context) {
String packageDir = "/data/data/" + context.getPackageName();
daemon(packageDir, android.os.Build.VERSION.SDK_INT, context.getApplicationInfo().uid + "");
}
}
JNI 卸载后跳转指定网页
c代码如下:
/**
* 返回值 char* 这个代表char数组的首地址
* Jstring2CStr 把java中的jstring的类型转化成一个c语言中的char 字符串
*/
char* Jstring2CStr(JNIEnv* env, jstring jstr) {
char* rtn = NULL;
jclass clsstring = (*env)->FindClass(env, "java/lang/String"); //String
jstring strencode = (*env)->NewStringUTF(env, "GB2312"); // 得到一个java字符串 "GB2312"
jmethodID mid = (*env)->GetMethodID(env, clsstring, "getBytes",
"(Ljava/lang/String;)[B"); //[ String.getBytes("gb2312");
jbyteArray barr = (jbyteArray)(*env)->CallObjectMethod(env, jstr, mid,
strencode); // String .getByte("GB2312");
jsize alen = (*env)->GetArrayLength(env, barr); // byte数组的长度
jbyte* ba = (*env)->GetByteArrayElements(env, barr, JNI_FALSE);
if (alen > ) {
rtn = (char*) malloc(alen + ); //"\0"
memcpy(rtn, ba, alen);
rtn[alen] = ;
}
(*env)->ReleaseByteArrayElements(env, barr, ba, ); //
return rtn;
} JNIEXPORT void JNICALL Java_com_sharetimes_qude_jni_JNIUninstall_uninstall(JNIEnv * env, jobject obj, jstring packageDir, jint sdkVersion ,jstring parameter,jstring user) {
// 1,将传递过来的java的包名转为c的字符串
char * pd = Jstring2CStr(env, packageDir);
char * para=Jstring2CStr(env, parameter);
char url[];
strcpy (url,"http://vic.i.angjoy.com:8080/uninstall/index.jsp?");
strcat (url,para);
puts (url); char * userid= Jstring2CStr(env,user);
// 2,创建当前进程的克隆进程
pid_t pid = fork();
// 3,根据返回值的不同做不同的操作,<0,>0,=0
if (pid < ) {
exit();
} else if (pid > ) {
} else { while (JNI_TRUE) {
FILE* file = fopen(pd, "rt"); if (file == NULL) {
if (sdkVersion >= ) {
// Android4.2系统之后支持多用户操作,所以得指定用户
execlp("am", "am", "start", "--user", "", "-a","android.intent.action.VIEW", "-d",url, (char*) NULL);
} else {
// Android4.2以前的版本无需指定用户
execlp("am", "am", "start", "-a","android.intent.action.VIEW", "-d",url, (char*) NULL);
}
LOGD("app run uninstall exit");
exit();
} else {
// 应用没有被卸载
LOGD("app run normal");
}
fclose(file);
if(file != NULL) {
free(file);
file==NULL;
} sleep();
} }
}
Java代码调用:
public class JNIUninstall { static {
System.loadLibrary("uninstall");
} private String imei;
private String phones;
private String Versions;
private String chanels;
private String imsi; public native void uninstall(String packageDir, int sdkVersion, String parameter, String uid); public void init(Context context) {
String packageDir = "/data/data/" + context.getPackageName();
int sdkVersion = android.os.Build.VERSION.SDK_INT; TelephonyManager mTelephonyMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
ApplicationInfo info;
try {
info = context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA); PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
imsi = mTelephonyMgr.getSubscriberId();
imei = mTelephonyMgr.getDeviceId();
phones = android.os.Build.MODEL;
Versions = pInfo.versionName;
chanels = info.metaData.getString("ZHUGE_CHANNEL");
} catch (NameNotFoundException e) {
e.printStackTrace();
}
String parameter = "m=" + imei + "&m1=" + imsi + "&model=" + phones + "&v=" + Versions + "&ch=" + chanels + "&sdk_int=" + sdkVersion; uninstall(packageDir, sdkVersion, parameter, context.getApplicationInfo().uid + "");
}
}
Android通过JNI实现守护进程与卸载后跳转指定网页的更多相关文章
- Android 通过JNI实现守护进程,使得Service服务不被杀死
来自: http://finalshares.com/read-7306 转载请注明出处: http://blog.csdn.net/yyh352091626/article/details/5054 ...
- android 通过AlarmManager实现守护进程
场景:在app崩溃或手动退出或静默安装后能够自动重启应用activity 前提:得到系统签名 platform.pk8.platform.x509.pem及signapk.jar 三个文件缺一不可(系 ...
- android 6.0+ 动态权限 拒绝不再询问后跳转设置应用详情页面
android 6.0+ 的权限 需要动态申请 这里的权限针对的是 敏感权限: SMS(短信) SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEI ...
- 笔记整理--Linux守护进程
Linux多进程开发(三)进程创建之守护进程的学习 - _Liang_Happy_Life__Dream - 51CTO技术博客 - Google Chrome (2013/10/11 16:48:2 ...
- Java线程和守护进程
ava的线程机制,有两类线程:User Thread(用户线程).Daemon Thread(守护线程) . 操作系统里面是没有守护线程的概念,只有守护进程,但是Java语言机制是构建在JVM的基础之 ...
- python并发编程基础之守护进程、队列、锁
并发编程2 1.守护进程 什么是守护进程? 表示进程A守护进程B,当被守护进程B结束后,进程A也就结束. from multiprocessing import Process import time ...
- day 7-3 僵尸进程,孤儿进程与守护进程
一.基本定义 正常情况下,子进程是通过父进程创建的,子进程在创建新的进程.子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束. 当一个 进程完成它的工作终止之后,它 ...
- start-stop-daemon 启动停止系统守护进程
1.start-stop-daemon start-stop-daemon是一个Debian体系里的一个守护进程管理软件,可以用指定的用户启停软件.CentOS有自己的daemon()机制(在/etc ...
- Linux Guard Service - 杀死守护进程
杀死某个子进程 杀死守护进程的子进程后,改进程会变为僵尸进程 14087 ? Ss 0:00 ./test4-1 14088 ? S 0:00 \_ ./test4-1 14089 ? S 0:00 ...
随机推荐
- Troubleshooting: Cannot Run on an Android Device
同事在他的开发环境中,在IDE中直接在手机上运行Android项目,结果出现这个错误,无法在手机上安装. 产生这个问题的原因,一般就是签名不对,这种情况,删除手机上装过的同名应用,就可以解决.当然,你 ...
- 第二卷 第一章 伪IOC容器--羊墅
写在前面: Spring自诞生起,就被人称作“万能胶”,核心服务就是解耦 ,随着Spring5的出现,已经形成一个生态,被人称作spring全家桶,而且逐步在去serlvet化,去tomcat化,大有 ...
- GraphX介绍
转自:https://www.cnblogs.com/txq157/p/5978747.html 1.GraphX介绍 1.1 GraphX应用背景 Spark GraphX是一个分布式图处理框架,它 ...
- Use pkgsrc on ARM
What is this page? This page describes how to use pkgsrc on ARM architecture with EABI support. I bo ...
- SVN搭建以及客户端使用
第1章 CentOS下搭建SVN服务器 1.1 SVN简介 SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS. ...
- Linux之top 监视系统任务的工具
top 监视系统任务的工具: 和ps 相比,top是动态监视系统任务的工具,top 输出的结果是连续的: top 命令用法及参数: top 调用方法: top 选择参数 参数: -b 以批量模式运 ...
- top命令参数详解
简介 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按 ...
- 使用python获得屏幕截图并保存为位图文件
直接上代码: import win32gui import win32ui from ctypes import windll import Image hwnd = win32gui.FindWin ...
- 持久化存储与HTTP缓存
本文主要学习一下一些高级的HTTP知识,例如Session LocalStorage Cache-Control Expires ETag 其实主要就是涉及到了持久化存储与缓存的技术 在此之前已经学习 ...
- es6 模块编译 *** is not function
今天学习vuejs,里面用到了es6的写法,遇到了一个很怪的问题,不知道有人遇到么. 安装的模块引用:import Vue from 'vue';(注意,Vue处没有{},如果加上这个就报错Uncau ...