android JNI调用 execlp函数
execlp()函数
execlp函数简单的来说就是C语言中执行系统命令的函数
execlp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名, 找到后便执行该文件, 然后将第二个以后的参数当做该文件的argv[0], argv[1], ..., 最后一个参数必须用空指针(NULL)作结束.
android开发中,execlp函数对应android的path路径为system/bin/目录下
调用格式:
execlp("am","am","start","--user","0","-a","android.intent.action.VIEW","-d","http://www.google.com.hk",(char*)NULL);
监听APP被卸载后打开浏览器跳到指定网址实例源码如下:
.h代码:
/*
* MonitorUnistall.h
*
*/
#include <jni.h>
#ifndef MONITORUNISTALL_H_
#define MONITORUNISTALL_H_
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com.vkex.vkmonitoruninstall.MainActivity
* Method: uninstall
* Signature: (Ljava/lang/String;I)V
*/
JNIEXPORT void JNICALL Java_com_vkex_vkmonitoruninstall_MainActivity_uninstall
(JNIEnv *, jobject, jstring, jint);
#ifdef __cplusplus
}
#endif
#endif /* MONITORUNISTALL_H_ */
.cpp代码:
#include<MonitorUnistall.h>
#include <stdio.h>
#include <jni.h>
#include <malloc.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/inotify.h>
#include <fcntl.h>
#include <stdint.h>
#include <android/log.h>
#define LOG_TAG "System.out.c"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
/**
* 返回值 char* 这个代表char数组的首地址
* Jstring2CStr 把java中的jstring的类型转化成一个c语言中的char 字符串
*/
char* Jstring2CStr(JNIEnv* env, jstring jstr) {
char* rtn = NULL;
jclass clsstring = env->FindClass("java/lang/String"); //String
jstring strencode = env->NewStringUTF("GB2312"); // 得到一个java字符串 "GB2312"
jmethodID mid = env->GetMethodID(clsstring, "getBytes",
"(Ljava/lang/String;)[B"); //[ String.getBytes("gb2312");
jbyteArray barr = (jbyteArray) env->CallObjectMethod(jstr, mid, strencode); // String .getByte("GB2312");
jsize alen = env->GetArrayLength(barr); // byte数组的长度
jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
if (alen > 0) {
rtn = (char*) malloc(alen + 1); //"\0"
memcpy(rtn, ba, alen);
rtn[alen] = 0;
}
env->ReleaseByteArrayElements(barr, ba, 0); //
return rtn;
}
JNIEXPORT void JNICALL Java_com_vkex_vkmonitoruninstall_MainActivity_uninstall(
JNIEnv * env, jobject obj, jstring packageDir, jint sdkVersion) {
// 1,将传递过来的java的包名转为c的字符串
char * pd = Jstring2CStr(env, packageDir);
// 2,创建当前进程的克隆进程
pid_t pid = fork();
// 3,根据返回值的不同做不同的操作,<0,>0,=0
if (pid < 0) {
// 说明克隆进程失败
LOGD("current crate process failure");
} else if (pid > 0) {
// 说明克隆进程成功,而且该代码运行在父进程中
LOGD("crate process success,current parent pid = %d", pid);
} else {
// 说明克隆进程成功,而且代码运行在子进程中
LOGD("crate process success,current child pid = %d", pid);
// 4,在子进程中监视/data/data/包名这个目录
//初始化inotify进程
int fd = inotify_init();
if (fd < 0) {
LOGD("inotify_init failed !!!");
exit(1);
}
//添加inotify监听器
int wd = inotify_add_watch(fd, pd, IN_DELETE);
if (wd < 0) {
LOGD("inotify_add_watch failed !!!");
exit(1);
}
//分配缓存,以便读取event,缓存大小=一个struct inotify_event的大小,这样一次处理一个event
void *p_buf = malloc(sizeof(struct inotify_event));
if (p_buf == NULL) {
LOGD("malloc failed !!!");
exit(1);
}
//开始监听
LOGD("start observer");
ssize_t readBytes = read(fd, p_buf, sizeof(struct inotify_event));
//read会阻塞进程,走到这里说明收到目录被删除的事件,注销监听器
free(p_buf);
inotify_rm_watch(fd, IN_DELETE);
// 应用被卸载了,通知系统打开用户反馈的网页
LOGD("app uninstall,current sdkversion = %d", sdkVersion);
if (sdkVersion >= 17) {
// Android4.2系统之后支持多用户操作,所以得指定用户
execlp("am", "am", "start", "--user", "0", "-a",
"android.intent.action.VIEW", "-d", "http://www.baidu.com",
(char*) NULL);
} else {
// Android4.2以前的版本无需指定用户
execlp("am", "am", "start", "-a", "android.intent.action.VIEW",
"-d", "http://www.baidu.com", (char*) NULL);
}
}
}
android.mk 代码:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := MonitorUninstall
LOCAL_SRC_FILES := MonitorUninstall.cpp
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)
MainActivity代码:
public class MainActivity extends Activity {
static {
System.loadLibrary("MonitorUninstall");
}
public native void uninstall(String packageDir, int sdkVersion);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String packageDir = "/data/data/" + getPackageName();
int sdkVersion = android.os.Build.VERSION.SDK_INT;
uninstall(packageDir, sdkVersion);
}
}
android JNI调用 execlp函数的更多相关文章
- android JNI调用(转)
Android jni开发资料--NDK环境搭建 android开发人员注意了 谷歌改良了ndk的开发流程,对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwi ...
- Android中调用C++函数的一个简单Demo
这里我不想多解释什么,对于什么JNI和NDK的相关内容大家自己去百度或谷歌.我对Android的学习也只是个新手.废话少说直接进入正题. 一.在Eclipse中创建一个Android Applicat ...
- android JNI调用机制
JNI的出现使得开发者既可以利用Java语言跨平台.类库丰 富.开发便捷等特点,又可以利用Native语言的高效. JNI是JVM实现中的一部分,因此Native语言和Java代码都运行在JVM的宿主 ...
- android JNI调用(Android Studio 3.0.1)(转)
最近回头复习了一下android 的jni调用,却发现按以前的方法调用失败,一怒之下就重新摸索,碰了几次壁,发现网上好多教程都不能成功调用,于是记录一下现在AS版本成功好用的调用方法. 这里设定你的n ...
- Android Jni调用浅述
声明:欢迎转载,转载时请注明出处!http://blog.csdn.net/flydream0/article/details/7371692 1 简述 JNI是Java Native Interfa ...
- Android Jni 调用
Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息... 16 Chap 4:用javah产生一个.h文件... 17 Chap5:j ...
- android JNI 调用NDK方法
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- Android jni helloworld
新建Android项目,设置布局: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android& ...
- [置顶] Android JNI必须掌握的五点
1:JNI是什么? Java NativeInterface(JNI)是Java提供的一个很重要的特性.它使得用诸如C/C++等语言编写的代码可以与运行于Java虚拟机(JVM)中的 Java代码 ...
随机推荐
- heritrix 3.2.0 下载
由于archive.org屏蔽,编译完成版本 http://builds.archive.org/maven2/org/archive/heritrix/heritrix/3.2.0/ 无法下载. 现 ...
- 【转】Android 4.0.3 CTS 测试
原文网址:http://blog.csdn.net/zxm317122667/article/details/8508013 Android-CTS 4.0.3测试基本配置 1. Download C ...
- MicrosoftSQLServer中的锁模式
在SQL Server数据库中加锁时,除了可以对不同的资源加锁,还可以使用不同程度的加锁方式,即锁有多种模式,SQL Server中锁模式包括: 1.共享锁 SQL Server中,共享锁用于所有的只 ...
- C# -- 扩展方法的应用(Extension Methods)
当你有下面这样一个需求的时候,扩展方法就会起到作用:在项目中,类A需要添加功能,我们想到的就是在类A中添加公共方法,这个显而易见肯定可以,但是由于某种原因,你不能修改类A本身的代码,但是确实又需要增加 ...
- linux find命令-print0和xargs中-0使用技巧(转载)
本文介绍了linux find命令中-print0和xargs中-0用法技巧,一些find命令的使用经验,需要的朋友参考下. 本节内容:linux find命令中-print0和xargs中-0的用法 ...
- c++之 printf 打印内容
该代码全部在Visual Studio 2015中编写,有关VS2015的安装流程后期在写相关的博文 首先让我们来输出一下hello, world! 1.首先新建一个main.cpp的文件,然后在该文 ...
- Java 5 的新标准语法和用法详解集锦
Java 5 的新标准语法和用法详解集锦 Java 5 的新标准语法和用法详解集锦 (需要在首选项-java-complier-compiler compliance level中设置为java5.0 ...
- QOdbc 读写 excel
).toString(); ).toInt(); qDebug()<< name << age <<endl; } // 关闭数据库 db.close(); } i ...
- ASP.NET内核几大对象、ASP.NET核心知识(6)--转载
这篇博文主要介绍一下几个对象. 1)HttpContext 2)HttpRequest 3)HttpResponse 4)context. Server 5)context.Session HttpC ...
- jquery mouseout和mouseleave区别
mouseout()和mouseleave() 都是鼠标移出元素时触发,但是这两者又有所区别,需要大家留意: 不论鼠标指针离开指定元素还是该元素子元素,都会触发 mouseout 事件. 只有在鼠标指 ...