【黑马程序员】卸载app同时删除自定义缓存目录_第1页
【黑马程序员】卸载app同时删除自定义缓存目录_第2页
【黑马程序员】卸载app同时删除自定义缓存目录_第3页
【黑马程序员】卸载app同时删除自定义缓存目录_第4页
【黑马程序员】卸载app同时删除自定义缓存目录_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【黑马程序员】卸载app同时删除自定义缓存目录hello,大家好,今天给大家带来点不一样的东西,不知道大家有没有注意过,有些app在卸载的时候同时将在sd卡下的缓存目录给删除了,是不是觉得很纳闷?那今天呢,就由我来带大家玩玩这个东西,当然呢,要玩这个其实是需要jni的铺垫的哦先带着大家来了解下如何去做这个功能,首先卸载app的时候app自己能知道么?似乎不行吧?所以咱们没法通过自带的api去实现。那么就废话少说,lets go!关于jni这块,简单带着大家过下java调用c吧。第一步,写java代码,写一个natvie方法 public native String getServerInfo(String path);第二步。创建jni目录,在目录中创建test.c文件,同时将jni.h文件 放入jni目录写c代码,注意方法名,并且引入jni.h #include #include jstring Java_com_example_untitled_MyActivity_getServerInfo(JNIEnv* env, jobject thiz, jstring path) 写方法。 注意:方法名的写法如下 Java_包名_类型_方法名(jvm虚拟机的指针,调用者对象)这里生成方法名也可以通过ndk来实现的分为2步*通过dos命令使用javac -d . Test.java 命令编译带有native方法的.java文件,这样就会在当前目录中生成一个class文件 会生成com/b3a4a/jnitest/Test.class*通过javah命令来生成例如 javah com.b3a4a.jnitest.Test,会生成.h的头文件 生成 com_b3a4a_jnitest_Test.h 文件,方法名就在.h头文件中 JNIEXPORT jstring JNICALL Java_com_b3a4a_jnitest_Test_getServerInfo (JNIEnv *, jobject);第三步,在jni目录中创建文件,andorid.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := test LOCAL_SRC_FILES := test.c LOCAL_C_INCLUDES := $(LOCAL_PATH)/include LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog include $(BUILD_SHARED_LIBRARY)第四步,进入命令行,进入应用程序的包的目录,执行ndk-build命令,创建Application.mk,自己填写需要的处理器型号,生成不同的so文件 APP_ABI := armeabi armeabi-v7a x86第五步,将生成的libtest.so 放入lib/armeabi目录(目录不需要自己建)第六步,java代码里面,把动态链接库加载到jvm虚拟机 static System.loadLibrary(库文件名称不带前缀,后缀名); 第7步,java中直接调用native方法JNI开发中的常见错误:1.写错了load的library java.lang.UnsatisfiedLinkError: Couldnt load hell0: findLibrary returned null2.Android.mk文件编写错误 /jni/Android.mk:4: * missing separator.Stop.3.LOCAL_MODULE配置不能有扩展名 /jni/Android.mk:hello.so: LOCAL_MODULE_FILENAME must not contain a file extension4.c或者c+的源文件名称配置错误 objs/hello/helo.o.Stop.5.如果使用了错误的cpu平台 java.lang.UnsatisfiedLinkError: Couldnt load hello: findLibrary returned null 添加多cpu平台的支持 APP_ABI := armeabi armeabi-v7a x866.c语言方法名称错误,导致java代码无法寻找到c代码 Caused by: java.lang.UnsatisfiedLinkError: Native method not found: com.itheima.hellojni.MainActivity.helloFromC:()Ljava/lang/String;ok。jni的东西带着大家回顾完了那么咱们开始具体实现咯关键代码其实就是c这块实现的,先贴代码,再和大家说下实现过程0102030405060708091011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798#include #include #include #include #include #include #include #include #include #include #include #include #define MAX_PATH 1024/* 宏定义begin */#define MEM_ZERO(pDest, destSize) memset(pDest, 0, destSize)/LOG宏定义#define LOG_INFO(tag, msg) _android_log_write(ANDROID_LOG_INFO, tag, msg)#define LOG_DEBUG(tag, msg) _android_log_write(ANDROID_LOG_DEBUG, tag, msg)#define LOG_WARN(tag, msg) _android_log_write(ANDROID_LOG_WARN, tag, msg)#define LOG_ERROR(tag, msg) _android_log_write(ANDROID_LOG_ERROR, tag, msg)/* 内全局变量begin */static char c_TAG = onEvent;static jboolean b_IS_COPY = JNI_TRUE;jstring Java_com_itheima_untitled_MyActivity_init(JNIEnv* env, jobject thiz,jstring path) jstring tag = (*env)-NewStringUTF(env, c_TAG);/初始化logLOG_DEBUG(*env)-GetStringUTFChars(env, tag, &b_IS_COPY),(*env)-GetStringUTFChars(env, (*env)-NewStringUTF(env, init OK), &b_IS_COPY);/fork子进程,以执行轮询任务pid_t pid = fork();if (pid GetStringUTFChars(env, tag, &b_IS_COPY),(*env)-GetStringUTFChars(env, (*env)-NewStringUTF(env, fork failed !), &b_IS_COPY); else if (pid = 0) int fileDescriptor = inotify_init();if (fileDescriptor GetStringUTFChars(env, tag, &b_IS_COPY),(*env)-GetStringUTFChars(env, (*env)-NewStringUTF(env, inotify_init failed !), &b_IS_COPY);exit(1);int watchDescriptor;watchDescriptor = inotify_add_watch(fileDescriptor,/data/data/com.itheima.untitled, IN_DELETE);if (watchDescriptor GetStringUTFChars(env, tag, &b_IS_COPY),(*env)-GetStringUTFChars(env, (*env)-NewStringUTF(env, inotify_add_watch failed !), &b_IS_COPY);exit(1);/分配缓存,以便读取event,缓存大小=一个struct inotify_event的大小,这样一次处理一个eventvoid *p_buf = malloc(sizeof(struct inotify_event);if (p_buf = NULL) LOG_DEBUG(*env)-GetStringUTFChars(env, tag, &b_IS_COPY),(*env)-GetStringUTFChars(env, (*env)-NewStringUTF(env, malloc failed !), &b_IS_COPY);exit(1);/开始监听LOG_DEBUG(*env)-GetStringUTFChars(env, tag, &b_IS_COPY),(*env)-GetStringUTFChars(env, (*env)-NewStringUTF(env, start observer), &b_IS_COPY);size_t readBytes = read(fileDescriptor, p_buf,sizeof(struct inotify_event);/read会阻塞进程,走到这里说明收到目录被删除的事件,注销监听器free(p_buf);inotify_rm_watch(fileDescriptor, IN_DELETE);/目录不存在logLOG_DEBUG(*env)-GetStringUTFChars(env, tag, &b_IS_COPY),(*env)-GetStringUTFChars(env, (*env)-NewStringUTF(env, uninstalled), &b_IS_COPY);/删除文件execlp(rm, rm, -rf,(*env)-GetStringUTFChars(env, path, &b_IS_COPY),(char *) NULL); else /父进程直接退出,使子进程被init进程领养,以避免子进程僵死return (*env)-NewStringUTF(env, Hello

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论