需求是,使用native方式,读取apk包里的lua代码,读进c#,做解密

一准备unity工程

public class GameMain : MonoBehaviour {
public const string libName = "TGNative";
public Text content;
[DllImport(libName)]
public static extern int ReadAsset(string fileName, byte[] buffer, int size);
// Use this for initialization
void Start () {
Debug.Log("Start################");
var size = * ;
var buffer = new byte[size];
var num = ReadAsset("test.txt", buffer, size);
Debug.Log("ReadAsset ################"+ num);
if (num > )
{
Debug.Log("Read succ");
var str = UTF8Encoding.UTF8.GetString(buffer,, num);
content.text = str;
Debug.Log(str);
}
} // Update is called once per frame
void Update () { }
}

二unity导出android工程

注意playersetting 里设置包名

三android studio 打开导出的工程

四 添加代码

UnityPlayerActivity里

新增TGNative.java,增加native方法

public native static void InitAssetManager( AssetManager am );

五使用javah生成头文件

javah -d jni -classpath D:\work\ndkread\AssetMgr\AndroidAssetMgr\NativeAssetMgr\build\intermediates\classes\debug;C:\Users\Topjoy\AppData\Local\Android\Sdk\platforms\android-\android.jar com.topjoy.JniTest.TGNative

六新增NativeUtil.c和Android.mk Applicatioin,mk ,build.bat

build.bat

ndk-build NDK_PROJECT_PATH=. NDK_APPLICATION_MK=Application.mk APP_BUILD_SCRIPT=Android.mk APP_PLATFORM=android-

NativeUtil.c

//
// Created by Topjoy on 2018/12/7.
//
#include <jni.h>
#include <assert.h>
#include <string.h>
#include <malloc.h>
#include <android/asset_manager.h>
#include <android/asset_manager_jni.h>
#include <android/log.h>
#include "com_topjoy_JniTest_TGNative.h" #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,"Unity",__VA_ARGS__) // 定义LOGD类型
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,"Unity",__VA_ARGS__) static AAssetManager* mgr = NULL;
JNIEXPORT void JNICALL Java_com_topjoy_JniTest_TGNative_InitAssetManager
(JNIEnv * env, jclass tis, jobject assetmanager){
mgr = AAssetManager_fromJava(env, assetmanager);
} extern int ReadAsset(char* fileName, char* buffer, int size)
{
if(mgr == NULL)
{
LOGW( "mgr is null" );
return ;
}
AAsset* asset = AAssetManager_open(mgr, fileName, AASSET_MODE_UNKNOWN);
if( asset == NULL )
{
LOGW( "open asset (%s) failed" , fileName);
return ;
}
int len = (int)AAsset_getLength(asset);
if(len >size)
{
LOGW("Buffer less than length");
return ;
}
int nread = AAsset_read(asset, buffer, size);
AAsset_close(asset);
if(nread != len)
{
LOGW("Read num %d not equal length %d", nread, len);
return ;
}
return nread;
}

七运行build.bat 生成so文件

八使用jar命令生成jar文件

@echo off
set app=%cd%
set debugp=%cd%\build\intermediates\classes\debug
set classp=%debugp%\com\topjoy\JniTest
cd %classp% pause
for %%x in (*) do (
if not "%%x"=="UnityPlayerActivity.class" (
if not "%%x"=="TGNative.class" (
del %%x
)
)
) cd %debugp%
jar -cvf class.jar com move class.jar %app%\

九把生成的class.jar 和so文件拷贝进unity工程

十生成apk,拷贝进木木测试

成功!

Unity使用native读取streamingasset里文件的更多相关文章

  1. unity Android在streamingAssets路径下文件无法读取的的解决方法

    unity Android在streamingAssets路径下文件,有时候plugin下的.jar或者.so无法直接读取: 解决方法之一,拷贝至其他路径: #if UNITY_ANDROID str ...

  2. JAVA读取本地html文件里的html文本

    /** * 读取本地html文件里的html代码 * @param file File file=new File("文件的绝对路径") * @return */ public s ...

  3. Unity Assets目录下的特殊文件夹名称

    1.隐藏文件夹以.开头的文件夹会被Unity忽略.在这种文件夹中的资源不会被导入,脚本不会被编译.也不会出现在Project视图中.2.Standard Assets在这个文件夹中的脚本最先被编译.这 ...

  4. 【Unity基础知识之三】Unity Assets目录下的特殊文件夹名称

    Unity3D的特殊目录名称   Unity预留了一些目录名称,这些目录有着特殊的含义.比较重要的有: Resources这个目录下的所有文件都会被打包到发布版本中,程序可以通过文件路径来访问它们.这 ...

  5. JNI读取assets资源文件

    源自:http://www.rosoo.net/a/201112/15459.html assets目录底下的文件会被打包到一个apk文件里,这些资源在安装时他们并没被解压,使用时是直接从apk中读取 ...

  6. (转)Unity Assets目录下的特殊文件夹名称(作用和是否会被打包到build中)

    原文:http://wiki.unity3d.com/index.php/Special_Folder_Names_in_your_Assets_Folder 1.隐藏文件夹以.开头的文件夹会被Uni ...

  7. 在Unity中使用LitJson解析json文件

    LitJson 这个库需要找资源,找到LitJson.dll后将它放在Assets文件夹下,在脚本中使用using引入即可 测试代码 json文件: {"Archice":[{&q ...

  8. 如何读取Access里的OLE类型的图片

    身份证一类读卡器读取的照片信息,保存在Access数据库中一般为OLE型字段,图片为BMP格式,因为是用其读卡器写入的,其数据类型为常二进制数据. 再用报表或EXCEL读取这些图片时,如果将该图片字段 ...

  9. 不可或缺 Windows Native (10) - C 语言: 文件

    [源码下载] 不可或缺 Windows Native (10) - C 语言: 文件 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 文件 示例cFile.h #ifn ...

随机推荐

  1. spring学习笔记(五)

    1.后置通知 需求:调用相应业务方法后,完成资源的关闭. a. 在beans.xml中配置 .... <beans> <!--配置被代理对象--> <bean id=&q ...

  2. 动态获取html页面的内容,而且取当中的某块元素的方法

     $.ajax({  url: "http://192.168.1.59:8888/app-tpl-webapp/tpl/design.html",  async:false, ...

  3. Linux下lvm在线扩容步骤

    转 :https://jingyan.baidu.com/article/25648fc18f22b29191fd0011.html 图片看不清可以看原文 LVM是逻辑盘卷管理(Logical Vol ...

  4. 美团HD(8)-利用NSPredicate匹配搜索结果

    监听文本框改变: DJSelectCityViewController.m /** 当searchBar内的文字发生改变时调用此方法 */ - (void)searchBar:(UISearchBar ...

  5. python剑指网络篇二

    在socket编程中 AF_INET 对应 IPv4 SOCK_STREAM 对应 TCP SOCK_DGRAM 对应 UDP

  6. ex:0602-169 遇到不完整或无效的多字节字符,转换失败

    错误原因:在AIX系统中,用vi命令编辑文件,出现rt错误,是因为AIX系统不识别文件编码格式. 解决方法:建议重新新建一个编码格式为ASC的文件,再重新上传到AIX系统中,或者改变访问linux的客 ...

  7. Java Resource路径小结

    首先一点很重要,Java中不存在标准的相对路径,各种相对路径取资源的方式都是基于某种规则转化为绝对路劲 然后一点也很重要,绝对不要直接使用绝对路径,否则死得很难看 基于以上两点,总结Resource路 ...

  8. a标签跳转新页面

    var url = $("#email_kong").val();       //url=mail.qq.com url = "http://"+url;   ...

  9. 获取jsapi_ticket

    String accessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&a ...

  10. 012android初级篇之Handler机制

    设计Handler类的目的 Handler类被用来注册到一个线程中,这样可以提供一个简单的通信渠道,用来发送数据到这个线程. 可作为UI线程与后台线程交互的几种方法之一. 具体用途 消息的分发和处理, ...