Unity使用native读取streamingasset里文件
需求是,使用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里文件的更多相关文章
- unity Android在streamingAssets路径下文件无法读取的的解决方法
unity Android在streamingAssets路径下文件,有时候plugin下的.jar或者.so无法直接读取: 解决方法之一,拷贝至其他路径: #if UNITY_ANDROID str ...
- JAVA读取本地html文件里的html文本
/** * 读取本地html文件里的html代码 * @param file File file=new File("文件的绝对路径") * @return */ public s ...
- Unity Assets目录下的特殊文件夹名称
1.隐藏文件夹以.开头的文件夹会被Unity忽略.在这种文件夹中的资源不会被导入,脚本不会被编译.也不会出现在Project视图中.2.Standard Assets在这个文件夹中的脚本最先被编译.这 ...
- 【Unity基础知识之三】Unity Assets目录下的特殊文件夹名称
Unity3D的特殊目录名称 Unity预留了一些目录名称,这些目录有着特殊的含义.比较重要的有: Resources这个目录下的所有文件都会被打包到发布版本中,程序可以通过文件路径来访问它们.这 ...
- JNI读取assets资源文件
源自:http://www.rosoo.net/a/201112/15459.html assets目录底下的文件会被打包到一个apk文件里,这些资源在安装时他们并没被解压,使用时是直接从apk中读取 ...
- (转)Unity Assets目录下的特殊文件夹名称(作用和是否会被打包到build中)
原文:http://wiki.unity3d.com/index.php/Special_Folder_Names_in_your_Assets_Folder 1.隐藏文件夹以.开头的文件夹会被Uni ...
- 在Unity中使用LitJson解析json文件
LitJson 这个库需要找资源,找到LitJson.dll后将它放在Assets文件夹下,在脚本中使用using引入即可 测试代码 json文件: {"Archice":[{&q ...
- 如何读取Access里的OLE类型的图片
身份证一类读卡器读取的照片信息,保存在Access数据库中一般为OLE型字段,图片为BMP格式,因为是用其读卡器写入的,其数据类型为常二进制数据. 再用报表或EXCEL读取这些图片时,如果将该图片字段 ...
- 不可或缺 Windows Native (10) - C 语言: 文件
[源码下载] 不可或缺 Windows Native (10) - C 语言: 文件 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 文件 示例cFile.h #ifn ...
随机推荐
- spring学习笔记(五)
1.后置通知 需求:调用相应业务方法后,完成资源的关闭. a. 在beans.xml中配置 .... <beans> <!--配置被代理对象--> <bean id=&q ...
- 动态获取html页面的内容,而且取当中的某块元素的方法
$.ajax({ url: "http://192.168.1.59:8888/app-tpl-webapp/tpl/design.html", async:false, ...
- Linux下lvm在线扩容步骤
转 :https://jingyan.baidu.com/article/25648fc18f22b29191fd0011.html 图片看不清可以看原文 LVM是逻辑盘卷管理(Logical Vol ...
- 美团HD(8)-利用NSPredicate匹配搜索结果
监听文本框改变: DJSelectCityViewController.m /** 当searchBar内的文字发生改变时调用此方法 */ - (void)searchBar:(UISearchBar ...
- python剑指网络篇二
在socket编程中 AF_INET 对应 IPv4 SOCK_STREAM 对应 TCP SOCK_DGRAM 对应 UDP
- ex:0602-169 遇到不完整或无效的多字节字符,转换失败
错误原因:在AIX系统中,用vi命令编辑文件,出现rt错误,是因为AIX系统不识别文件编码格式. 解决方法:建议重新新建一个编码格式为ASC的文件,再重新上传到AIX系统中,或者改变访问linux的客 ...
- Java Resource路径小结
首先一点很重要,Java中不存在标准的相对路径,各种相对路径取资源的方式都是基于某种规则转化为绝对路劲 然后一点也很重要,绝对不要直接使用绝对路径,否则死得很难看 基于以上两点,总结Resource路 ...
- a标签跳转新页面
var url = $("#email_kong").val(); //url=mail.qq.com url = "http://"+url; ...
- 获取jsapi_ticket
String accessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&a ...
- 012android初级篇之Handler机制
设计Handler类的目的 Handler类被用来注册到一个线程中,这样可以提供一个简单的通信渠道,用来发送数据到这个线程. 可作为UI线程与后台线程交互的几种方法之一. 具体用途 消息的分发和处理, ...