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 ...
随机推荐
- hadoop-hive的内表和外表
--创建内表create table if not exists employee(id int comment 'empoyeeid',dateincompany string comment 'd ...
- fetch的文件流下载及下载进度获取
下载过程中,获取进度,fetch API并没有提供类似xhr和ajax的 progress所以用 getReader()来循环读取大小 let size = 0; fetch( URL() + `/s ...
- SVN主从备份
SVN主从备份 两套环境:192.168.67.63(主SVN) 192.168.67.60(从SVN) 1.主环境上已经装好SVN并且存在数据仓库/home/svndata在从环境上,新建一/hom ...
- mint-ui下拉加载(项目实例)
<template> <div class="share"> <div class="header"> <div cl ...
- 【2017-04-20】Ado.Net与面向对象结合架构中的数据访问层(实体类,数据访问类)
开发项目三层架构:界面层.业务逻辑层.数据访问层 今天学习一下数据访问层,分为实体类和数据访问类 所有的类放在App_Code这个文件夹下边.养成一个好的习惯. 一.实体类 数据库中的表映射为一个类, ...
- ISO/IEC 15444-12 MP4 封装格式标准摘录 4
目录 Movie Fragments Movie Extends Box Movie Extends Header Box Track Extends Box Movie Fragment Box M ...
- Java语言基础(8)
1 数组(二) 1)for-each循环:增强的for循环,JDK1.5推出的,用来输出数组和集合中每一个元素的值. for(数据类型 变量 : 数组名){ 变量:临时保存元素的值 } 数据类型必须跟 ...
- java8 stream/optional个人测试demo记录
备忘记录 package cc.ash; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConst ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(27)|实战4:从零实现BTC区块链]
[易学易懂系列|rustlang语言|零基础|快速入门|(27)|实战4:从零实现BTC区块链] 项目实战 实战4:从零实现BTC区块链 我们今天来开发我们的BTC区块链系统. 简单来说,从数据结构的 ...
- zeromq实践
zeromq简介 zeroMQ不是TCP,不是socket,也不是消息队列,而是这些的综合体. ZeroMQ以嵌入式网络编程库的形式实现了一个并行开发框架(concurrency framework) ...