C++JNI开发
注意:
javah 编译生成的文件,直接复制到 jni 目录下
C++,函数使用时需要提前声明
在.cpp文件中 导入 include"生成的文件名"
fork子进程
核心代码分析:
for()介绍:
fork成功的分叉出一个子进程 会返回当前进程的id 但是只能在主进程中fork成功
在子进程中运行fork 会返回0 但是不能再分叉出新的进程
fork的返回值可能三种 >0 == 0 <0
使用:
pid == 0 进程已被杀死
int ppid = getppid(); 得到父进程
ppid == 1 ; 父进程被杀死了
判断是否是卸载了应用: ifelse中做相关处理
file = fopen("/data/data/com.itheima.cforkdemo","r");
if(file == NULL){}else{}
pid > 0
pid < 0
图解:
实例:
#include <jni.h>
#include <stdlib.h>
#include <stdio.h>
#include <android/log.h>
#define LOG_TAG "System.out"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
int ppid;
JNIEXPORT void JNICALL Java_com_uu_fork_MainActivity_fork(JNIEnv *env,
jobject clazz) {
int pid = fork();
FILE* file;
if (pid > 0) {
LOGD("pid = %d", pid);
} else if (pid == 0) {
//拿到父进程的进程编号
LOGD("pid == 0");
while(1){
ppid = getppid();
if (ppid == 1) {
//若父进程 为1,说明父进程 已被杀死
LOGD("ppid =%d", ppid);
file = fopen("/data/data/com.uu.fork", "r");
if (file == NULL) { //已被卸载
execlp("am", "am", "start", "--user", "0", "-a",
"android.intent.action.VIEW", "-d",
"http://www.baidu.com", (char *) NULL);
} else {
execlp("am", "am", "start", "--user", "0", "-n",
"com.uu.fork/com.uu.fork.MainActivity",
(char *) NULL);
}
}
LOGD("sub process is running");
sleep(2);
}
} else {
LOGD("pid<0");
}
}