您的位置:首页 > 移动开发 > Android开发

android JNI层读取assets目录文件

2015-03-18 18:17 375 查看
最近在做app加固方面的技术,遇到了一个问题,就是需要把assets目录下加密的文件写到目标app的/data/data/目录,研究了一下发现是可以实现的,下面直接上关键代码:
注:1:用的时候一定要记住修改方法名Java_com_cn_yu_Util 

2:用的时候记得把包名和文件名--com.cn.yu/abc.so修改成自己的包名和文件名

3:设备需root

4:需要引用两个头文件和在Android.mk文件中引用相关的库文件。

#include <android/asset_manager.h>

#include <android/asset_manager_jni.h>

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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android jni 技术