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

下载本文档

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

文档简介

黑马程序员传智播客旗下高端IT教育品牌改变中国IT教育,我们正在行动【黑马程序员】卸载app同时删除自定义缓存目录hello,大家好,今天给大家带来点不一样的东西,不知道大家有没有注意过,有些叩p在卸载的时候同时将在sd卡下的缓存目录给删除了,是不是觉得很纳闷?那今天呢,就由我来带大家玩玩这个东西,当然呢,要玩这个其实是需要jni的铺垫的哦〜〜〜先带着大家来了解下如何去做这个功能,首先卸载app的时候app自己能知道么?似乎不行吧?所以咱们没法通过自带的api去实现。那么就废话少说,let'sgo!关于jni这块,简单带着大家过下java调用c吧。第一步,写java代码,,写一个natvie方法publicnativeStringgetServerInfo(Stringpath);第二步。创建jni目录,在目录中创建test.c文件,同时将jni.h文件放入jni目录写c代码,注意方法名,并且引入jni.h#include<jni.h>#include<stdio.h>jstringJava_com_example_untitled_MyActivity_getServerInfo(JNIEnv*env,jobjectthiz,jstringpath){写方法。。。)注意:方法名的写法如下Java_包名发型_方法名(jvm虚拟机的指针,调用者对象)这里生成方法名也可以通过ndk来实现的分为2步黑马程序员济南中心编著

黑马程序员传智播客旗下高端黑马程序员传智播客旗下高端IT教育品牌改变中国IT教育,我们正在行动*通过dos命令使用javac-d.Test.java命令编译带有native方法的.java文件,这样就会在当前目录中生成一个class文件会生成com/b3a4a/jnitest/Test.class*通过javah命令来生成例如javahcom.b3a4a.jnitest.Test,会生成.h的头文件生成com_b3a4a_jnitest_Test.h文件,方法名就在.h头文件中JNIEXPORTjstringJNICALLJava_com_b3a4a_jnitest_Test_getServerInfo(JNIEnv*,jobject);第三步,在jni目录中创建文件,andorid.mkLOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)LOCAL_MODULE:=testLOCAL_SRC_FILES:=test.cLOCAL_C_INCLUDES:=$(LOCAL_PATH)/includeLOCAL_LDLIBS+=-L$(SYSROOT)/usr/lib-lloginclude$(BUILD_SHARED_LIBRARY)第四步进入命令行进入应用程序的包的目录执行ndk-build命令创建Application.mk,自己填写需要的处理器型号,生成不同的so文件APP_ABI:=armeabiarmeabi-v7ax86第五步,将生成的libtest.so放入lib/armeabi目录(目录不需要自己建)第六步,java代码里面,把动态链接库加载到jvm虚拟机static{System.loadLibrary("库文件名称不带前缀,后缀名)黑马程序员济南中心编著

黑马程序员传智播客旗下高端黑马程序员传智播客旗下高端IT教育品牌改变中国IT教育,我们正在行动)第7步,java中直接调用native方法JNI开发中的常见错误:写错了load的libraryjava.lang.UnsatisfiedLinkError:Couldn'tloadhell0:findLibraryreturnednullAndroid.mk文件编写错误/jni/Android.mk:4:***missingseparator.Stop.LOCAL_MODULE配置不能有扩展名//jni/Android.mk:hello.so:LOCAL_MODULE_FILENAMEmustnotcontainafileextensionc或者c++的源文件名称配置错误objs/hello/helo.o'.Stop.如果使用了错误的cpu平台java.lang.UnsatisfiedLinkError:Couldn'tloadhello:findLibraryreturnednull添加多cpu平台的支持APP_ABI:=armeabiarmeabi-v7ax86c语言方法名称错误,导致java代码无法寻找到c代码Causedby:java.lang.UnsatisfiedLinkError:Nativemethodnotfound:com.itheima.hellojni.MainActivity.helloFromC:()Ljava/lang/String;ok。jni的东西带着大家回顾完了~那么咱们开始具体实现咯〜关键代码其实就是c这块实现的,先贴代码,再和大家说下实现过程01#include02#include<string.h><jni.h>01#include02#include<string.h><jni.h>03黑马程序员济南中心编著黑马程序员传智播客旗下高端黑马程序员传智播客旗下高端IT教育品牌改变中国IT教育,我们正在行动04#include<jni.h>05#include<stdio.h>06#include<stdlib.h>07#include<string.h>08#include<android/log.h>09#include<unistd.h>10#include<sys/inotify.h>1112#include<sys/types.h>13#include<sys/stat.h>14#include<dirent.h>15#defineMAX_PATH10241617/*宏定义begin*/18#defineMEM_ZERO(pDest,destSize)memset(pDest,0,destSize)1920//LOG宏定义21#defineLOG_INFO(tag,msg)__android_log_write(ANDROID_LOG_INFO,tag,msg)22#defineLOG_DEBUG(tag,msg)__android_log_write(ANDROID_LOG_DEBUG,tag,msg)23#defineLOG_WARN(tag,msg)__android_log_write(ANDROID_LOG_WARN,tag,msg)24#defineLOG_ERROR(tag,msg)__android_log_write(ANDROID_LOG_ERROR,tag,msg)2526/*内全局变量begin*/27staticcharc_TAG[]="onEvent";28staticjbooleanb_IS_COPY=JNI_TRUE;293031jstringJava_com_itheima_untitled_MyActivity_init(JNIEnv*env,jobjectthiz,32 jstringpath){jstringtag=(*env)->NewStringUTF(env,c_TAG);3435 〃初始化logLOG_DEBUG((*env)->GetStringUTFChars(env,tag,&b_IS_COPY),37 (*env)->GetStringUTFChars(env,(*env)->NewStringUTF(env,38"initOK"),&b_IS_COPY));3940 //fork子进程,以执行轮询任务pid_tpid=fork();42 if(pid<0){43 〃出错logLOG_ERROR((*env)->GetStringUTFChars(env,tag,&b_IS_COPY),45 (*env)->GetStringUTFChars(env,46(*env)->NewStringUTF(env,"forkfailed!!!"),&b_IS_COPY));47 }elseif(pid==0){黑马程序员济南中心编著

黑马程序员传智播客旗下高端黑马程序员传智播客旗下高端IT教育品牌改变中国IT教育,我们正在行动intfileDescriptor=inotify_init();49 if(fileDescriptor<0){LOG_DEBUG((*env)->GetStringUTFChars(env,tag,&b_IS_COPY),51 (*env)->GetStringUTFChars(env,52(*env)->NewStringUTF(env,"inotify_initfailed!!!"),&b_IS_COPY));53 exit(1);54 }5556 intwatchDescriptor;watchDescriptor=inotify_add_watch(fileDescriptor,"/data/data/com.itheima.untitled",IN_DELETE);59 if(watchDescriptor<0){LOG_DEBUG((*env)->GetStringUTFChars(env,tag,&b_IS_COPY),61 (*env)->GetStringUTFChars(env,2(*env)->NewStringUTF(env,"inotify_add_watchfailed!!!"),&b_IS_COPY));6364 exit(1);65 }6667 〃分配缓存,以便读取event,缓存大小=一个structinotify_event的大小,68这样一次处理一个eventvoid*p_buf=malloc(sizeof(structinotify_event));if(p_buf==NULL){LOG_DEBUG((*env)->GetStringUTFChars(env,tag,&b_IS_COPY),72 (*env)->GetStringUTFChars(env,73(*env)->NewStringUTF(env,"mallocfailed!!!"),&b_IS_COPY));7475 exit(1);76 }77 〃开始监听LOG_DEBUG((*env)->GetStringUTFChars(env,tag,&b_IS_COPY),79 (*env)->GetStringUTFChars(env,80(*env)->NewStringUTF(env,"startobserver"),&b_IS_COPY));size_treadBytes=read(fileDescriptor,p_buf,sizeof(structinotify_event));8384 //read会阻塞进程,走到这里说明收到目录被删除的事件,注销监听器free(p_buf);inotify_rm_watch(fileDescriptor,IN_DELETE);8788 〃目录不存在logLOG_DEBUG((*env)->GetStringUTFChars(env,tag,&b_IS_COPY),90 (*env)->GetStringUTFChars(env,91(*env)->NewStringUTF(env,"uninstalled"),&b_IS_COPY));黑马程序员济南中心编著

黑马程序员传智播客旗下高端IT教育品牌黑马程序员传智播客旗下高端IT教育品牌改变中国IT教育,我们正在行动92939495969798execlp("rm","rm","-rf",(*env)->GetStringUTFChars(env,path,&b_IS_COPY),(char*)NULL);}else{〃父进程直接退出,使子进程被init进程领养,以避免子进程僵死}return(*

温馨提示

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

评论

0/150

提交评论