最近在做app加固方面的技术,遇到了一个问题,就是需要把assets目录下加密的文件写到目标app的/data/data/目录,研究了一下发现是可以实现的,下面直接上关键代码:
注:1:用的时候一定要记住修改方法名Java_com_cn_yu_Util
2:用的时候记得把包名和文件名--com.cn.yu/abc.so修改成自己的包名和文件名
3:设备需root
4:需要引用两个头文件和在Android.mk文件中引用相关的库文件。
#include
#include
LOCAL_LDLIBS += -landroid
void Java_com_hsbank_money_NativeUtil_nativeReadFromAssets(JNIEnv* env,jclass tis, jobject assetManager,jstring filename) { LOGI("ReadAssets"); AAssetManager* mgr = AAssetManager_fromJava(env, assetManager); if(mgr==NULL) { LOGI(" %s","AAssetManager==NULL"); return ; } /*获取文件名并打开*/ jboolean iscopy; const char *mfile = (char *)env->GetStringUTFChars(filename,&iscopy); AAsset* asset = AAssetManager_open(mgr, mfile,AASSET_MODE_UNKNOWN); if(asset==NULL) { LOGI(" %s","asset==NULL"); return ; } /*获取文件大小*/ off_t bufferSize = AAsset_getLength(asset); char *buffer=(char *)malloc(bufferSize+1); // buffer[bufferSize]=0; int numBytesRead = AAsset_read(asset, buffer, bufferSize); LOGI("file size : %d\n",numBytesRead); FILE * outfile = fopen("/data/data/com.hsbank.money/cache/trsm_so.so","wb+"); LOGI("open file :%s\n", strerror(errno)); fwrite(buffer,numBytesRead,1,outfile); free(buffer); fclose(outfile); /*关闭文件*/ AAsset_close(asset); }