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 ...
随机推荐
- vue+axios请求头封装
import { mapMutations } from 'vuex' import axios from 'axios' import { Toast } from 'mint-ui'; impor ...
- 第十一章、特性property
目录 第十一章.特性property 一.property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 二.为什么要用property 三.封装与拓展性 第十一章.特性property ...
- IDEA springboot maven 项目部署
- python学习-数据类型
计算机处理的数据不单纯的指数字,计算机可以处理数字.文本.音频.视频等等各种数据,下面描述的是Python中可以直接使用和处理的基本数据类型. 整数 Python可以处理任意大小的整数,跟ja ...
- 前端入门Js笔记
T 001 ____________--信息页面展示 需求分析: 有一个页面,在页面上有很多文字信息,且格式不一. 技术分析: html: 文字标签: 字体标签: 标题标签: 其他标签: 排版标签: ...
- Redis04——Redis常见语法
Redis语法 1.string select db 选择数据库(0-20) set k v 设置一个数据 set k1 v nx nx仅仅可以新建的时候进行插入数据 set k2 v xx xx仅仅 ...
- Web的了解和servlet的初次见面
web 相信大家都不陌生,平常我们浏览网页用的都是web服务.互联网起初的web就是非常简单的页面,但是随着客户需求越来越复杂,需要的功能越来越多,我们的服务器端需要处理的请求越来越多,需要区分不同的 ...
- c# 获取api 数据
private string GetDataFromServerApi(string url, string body) { string str = ""; try { Http ...
- ios11返回按钮问题
在苹果系统升级到iOS11之后,页面的返回按钮的点击区域是根据设置的按钮的frame来确定的,在设置按钮太小的时候,点击就会出现点击多次才能点击到一次的现象,处理的方法就是设置按钮的frame变大代码 ...
- centos6的配置
例子: