unity3d 调用c dll发布到安卓,但是调用了C++编写,DLL应该怎么办

Unity3d 调用 C++ 函数 实现加密防破解 (Android向)
日期: 10:04:14
来源:ITeye
Unity3d 调用 C++ 函数 实现加密防破解 (Android向)
因为Unity 采用C# 作为主要语言,代码编译之后作为DLL存在与执行文件中,这就给我们带来很大的一个问题,反编译非常容易。
如何反编译Unity游戏的代码:
Unity打包生成的安装包,我们随便下载一个游戏,解压APK,来到
assets\bin\Data\Managed
这个目录。
Assembly-CSharp.dll
Assembly-CSharp-firstpass.dll
你在游戏中编写的代码就存放在这两个dll中。
把dll拖放到MonoDevelop中,稍等片刻,就能看到dll中的代码。
如果有一些比较重要的代码不想让别人看到,那就用C++来编写,C++编译成so文件,反编译之后只能成为汇编语言,无疑加大了破解难度(当然不能百分百防破解,汇编大牛很多的)
我们先新建一个文件夹,在里面新建一个jni文件夹,新建一个c文件,内容如下:
#include&string.h&
#include&jni.h&
int Share()
return 1234561;
就这么一个函数吧,供C#调用。
然后新建一个Android.mk文件,这是NDK编译SO需要的一个mk文件,在里面指定了如何编译。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Share
LOCAL_SRC_FILES := Share.c
include $(BUILD_SHARED_LIBRARY)
然后新建一个Application.mk文件,指定编译平台以及其它的依赖。
APP_ABI :=armeabi-v7a
APP_PLATFORM:=android-8
APP_STL:=gnustl_static
APP_CFLAGS += -Wno-error=format-security
然后在jni文件夹中执行命令:
就会编译出来so文件,存放在上一级的lib中。
新建一个Unity3d的工程,然后编写代码,调用so中的的函数。
using UnityE
using System.C
using System.IO;
using System.Runtime.InteropS
public class test : MonoBehaviour {
[DllImport("Share")]
private static extern int Share();
// Use this for initialization
void Start ()
Debug.Log("Shared = "+Share());
// Update is called once per frame
void Update () {
注意 如果要调用SO中的函数一定要按照Unity指定的规则来编写:
[DllImport("Share")]
private static extern int Share();
在Unity工程中新建目录
Plugins\Android
拷贝SO文件到这里
然后我们导出APK安装测试
Demo工程下载:
http://download.csdn.net/detail/cp30985
本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
首先明确一下 android中的坐标系统 :屏幕的左上角是坐标系统原点(0,0),原点向右延伸是X轴正方向,原点向下延伸是Y轴正方向。
一、View的坐标
需要注意view的坐标是相对父容器而言的,包括:getTop()、getBottom(),getLeft(),getRight()。以getTop为例,函数源代码为:
/** * Top position of this view relative to its parent. *相对应父控件的top位置,单位为像素,即头部到父控件的距
1;把NSString切割出某一部分成NSString NSString *firstStr=[ self . textField . text substringWithRange : NSMakeRange ( 0 , 1 )]; 2:切割到数组中 NSArray* dateArray = [dateString componentsSeparatedByString: @"/"];
利用ApkPlug插件化框架将ShareSDK组件化,以实现按需动态加载和减小应用体积的目的。
ShareSDK是非常棒的移动社会化分享和评论工具,相信我们在开发应用过程中都离不开它。但是当我们集成ShareSDK时候同样会遇到一些问题。 1. ShareSDK包比较大,组合国内多家分享平台以后其SDK包的大小应该在1M以上,这对应用来说还是不小的负荷。 2. 集成ShareSDK过程中我们不可避免的需要将它的资源文件复制到应用的res资源目录下,这对我们应用后期维护造成不小
Android多分辨率适配是一件很有意义但是比较麻烦的事情,网上有很多关于多分辨率适配的文章,多数文章讲解的都是整个APP的图片比较规则,可以将图片做成9图来完成多分辨率适配,但是对于一些游戏类应用(这里说的游戏没有使用游戏引擎)、低龄儿童应用,APP中有很多花哨的图片,这种APP的图片显然无法做成9图,在网上查了很多资料始终没有比较理想的解决方案,结合自己最近做的项目介绍一下针对这种情况下的多分辨率适配: 为了减少UI的工作量,一个APP只提供一套图; 为了减少程序员的重复工作,一个APP只维护一套
写在前面: Android 设备可以接受和安装基于系统和应用的更新。在设备中有一个特殊 recovery 分区,在这个分区中有一套特殊的恢复系统可以将下载的更新包进行解压并应用到系统中去。 本节主要描述了更新包的组织架构,并且概述了如何使用更新包打包工具制作系统升级的更新包。 OTA
的存在是用来对潜在系统的升级,或者在系统分区安装只读(不可卸载)的应用程序,因此在升级过程中不会影响到用于已经安装到系统中的 应用程序。 本节的内容主要基于 Android5.x 版本。
一、Android 设备布局的
转载请表明出处: http://blog.csdn.net/u ( 嵌入式_小J的天空 ) 为了增强用户之间的交互,Android系统中提供了一些API和部件给我们开发美观有趣的应用。比如Android系统提供了ImageView来显示静态图片、AnimationDrawble来开发逐帧动画以及通过Animation对普通图片使用不减动画等。另外,Android应用中的图片不仅 包括*.png、*.jpg、*.gif等格式的位图 ,也包括 使用XML资源文件定义的各种Drawable
android NDK 开发 http post 小例子 定价为:xxx元 功能需求: 在android java 代码中,传入一个字符串 到jni中。 jni程序,就会将,这个字符串 post 到服务器 服务器收到POST内容之后,会将收到的内容,处理一下。返回给手机。 这时,jni程序,将接收到的返回内容。传到java应用程序。 1、java代码 public class UserUninstall { /** *
* @param ip * @param port * @param para *
if ([keyName rangeOfString : @"_" ]. location == NSNotFound ){
NSLog(@"不存在某一字符"); }
1.申请一个内网 ip 映射外网域名 账号 下载地址: /Pages_2_32.jsp 教程地址: /article/76a7e409b5e15a9.html 2.申请一个微信测试管理账号 注意, 此测试账号不能在真正的微信公众平台登录 只是做测试使用 申请地址: http://mp./debug/cgi-bin/sandbox?t=sandbox/login 教程地址:
打开相机的闪光灯 by 伍雪颖 - ( IBAction )openFlash:( id )sender {
AVCaptureDevice
*device = [ AVCaptureDevice
defaultDeviceWithMediaType : AVMediaTypeVideo ];
hasTorch ] [device
hasFlash ]) {
lockForConfiguration :
Copyright (C)
ITfish.net请教,想用C++写一个通信库,用在android的游戏上通过unity3d调用,该怎么做呢?
我还是新手,JAVA、android、网路编程都没接触过。。。
老大给我个任务,让我把现有的jar的通讯库改成用C++写的,提供API给现在的unity3d游戏通信用。
我先大概了解了一些基础知识。现在好像是Unity3d-&JNI-&android jar这种层次结构,而且U3D也是可以调用dll的,那我想我只要把jar换成c++的DLL就行了把。。。
然后我就把jar反编译,看java的源代码打算把它翻译成C++的。。。
但是我现在还是很迷惑,我该用windows的socket库还是linux的呢?还是没啥区别?因为老大说这个通讯库以后还要用到IOS的游戏里。
当然是unix下的socket了.客户端用异步select模型就可以了.本帖子已过去太久远了,不再提供回复功能。【Unity3D自学记录】浏览器调用本地安卓App
通过手机浏览器浏览网页调用本地安卓App 1.Html代码
&html& &head& &meta http-equiv=&Content-Type& content=&text/ charset=UTF-8&&gt
17:38&&&[]
公司现在做一个app,有一个分享功能,可以分享到微信等app中,然后在微信中打开该页面(转到浏览器中打开),会有一个立即打开的按钮,判断手机上是否安装了该app,如果安装则打开,未安装的话则下载,我现在的解决方案是这样的, var&ua&=&nbsp
12:07&&&[]
uWebKit是一个Unity3d插件,个人认为比较强大,值得收藏啊
有图有真相:
安装以及破解说明:
1、导入资源包
2、将破解目录里的Editor复制到工程项目的Assets目录下进行覆盖
3、打开下拉菜单的uWebKit & Activate
09:02&&&[]
我现在遇到的需求时,点击app的图标,直接打开手机的本地浏览器,注意这里是不要通过webview在app内直接打开网页,而是要打开本地浏览器或者其他已经安装的外部浏览器app,打开指定的网页,请问要怎么实现呢?谢谢。
回复讨论(解决方案)
请参考“Android调用默认
19:06&&&[]
安卓跟苹果手机上都试过,都是同样的问题,只有微信内置的浏览器不行,真的很郁闷
微信内做了限制!
你做个判断,如果是微信内打开,就不显示打开调用本地app的按钮!
你也可以看看微信jssdk是否支持打开本地app不
比如创建一个iframe。src地址改为你的程序的留
17:49&&&[]
开始浏览网页里面的内容,看完内容后,我想再次回到页面。这个时候执行Button1Click事件,问题来了,Button1Click不跳转了。请问哪里问题?
回复讨论(解决方案)
procedure&TForm1.Button1Click(Sender
21:26&&&[]
浏览器里就是不行。
var&oParser=new&DOMParser();
var&returnXML&=&(new&DOMParser()).parseFromString(req.responseXML.xml
11:12&&&[]
刚学习了unity3D有些代码看的不是很明白,请大神帮忙解释下!
在unity代码经常看到
if(audio){
if(rigidbody){
我看了API返回时对一个对象呀,怎么这样就可以了呢?请详细解释,非常感谢
回复讨论(解决方案)
因为重载了&nbsp
00:34&&&[]
刚学习了unity3D有些代码看的不是很明白,请大神帮忙解释下!
在unity代码经常看到
if(audio){
if(rigidbody){
我看了API返回时对一个对象呀,怎么这样就可以了呢?请详细解释,非常感谢
回复讨论(解决方案)
因为重载了&nbsp
15:45&&&[]
     由于公司用unity3d开发客户端部分,今天去参加了下unity3d成都开发者大会。在这里简单记录一下会议里关于unity3d的内容。   说到unity3d,第一次知道的时候也是大概3年前的事情。这几年它发展十分迅猛,不得不佩服他在中国市场上推广的投入。相对于unreal与crysis
11:57&&&[]
大家好,我是unity程序员,大学本科未毕业,校外unity实习经验一年。我的能力没有问题,一个新公司给我转正之后5K,房补500,每天包一顿午饭。我想知道这样的待遇是什么样的。。。
回复讨论(解决方案)
现在挺火的,能力没有问题的话去上海8K是没问题的,最近才了解的行情
-17:15&&&[]
在开发中可能会碰到这样的情况:有c/c++源文件,需要在c#中调用c/c++相关接口,但在c#中没法直接调用c/c++代码,我们可以先把c/c++代码编译成dll或so库文件,供c#代码调用。
1. 生成dll文件(windows下使用),下面是一个gid和uid相互转换的demo,需要把这两个
02:38&&&[]温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
我是阿赵,请多多指教!
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
开始第一篇的内容:首先,我们需要新建一个类库项目,可以使用Visual Studio或者Monodevelop来做。我这里是使用vs2012来创建:&选择好项目类型、写好项目名称。&新生成的项目里面默认有一个Class1类&可以通过在解决方案资源管理器里面进行重命名改成自己想要的类名,比如我这里改成了Math3D&然后写一个简单的静态方法在里面。这里我写了个最简单的加法(Add)。也可以不写静态方法,写出普通的public方法,用的时候new对象出来调用该方法也可以。这和正常的C#编程没区别。&写好之后,在资源管理器里面选择“生成”,那么在项目的bin/debug 里面就会看到dll文件,比如我这个额项目就是AzhaoDll.dll&接下来在Unity3D里面创建你需要的项目,把刚才的dll文件随便放到项目的Assets文件夹里面。关于这个dll文件的存放位置,网上有些人说是必须放在插件文件夹里面,其实是不需要的,放在任意位置它都能被识别出来。当然,按照良好的项目路径习惯,我们建立一个专门放插件的文件夹来存放dll文件,也是合理的。然后在Unity3D里面创建一个C#脚本,写一行简单的代码来调用我们刚才写的Math3D.Add方法。&这时会发现Math3D类不能识别,我们using AzhaoDll命名空间然后在Unity3D里把脚本挂到摄像机上,运行,可以看到打印出正确的结果了,这就证明了dll已经被成功调用了。&&回顾刚才我们做的一些小细节,在类库项目的Math3D类里面。我们默认的使用了AzhaoDll命名空间。那么假如我们不使用命名空间,或者使用其他的命名空间行不行?答案是可以的,命名空间可以任意的更改,如果不用命名空间,那么在调用的时候就不需要using,如果使用了其他命名空间,对应的using其命名空间就行了。以下试试把命名空间删掉:&那么在Unity3D里面调用就直接可以用了:&运行的结果也是正常的:当然,不太建议不使用命名空间,这样做一个说明,是因为unity3D本身创建的脚本默认没有使用命名空间,只是想说明如果不想麻烦,直接把Unity3D没有命名空间的脚本直接拿来编译也是可以的。再次回顾细节,刚才我们使用的是原生的C#,假如我们需要在类库项目写调用Unity3D本身功能的方法怎样办呢?在Unity3D的安装目录Editor\Data\Managed里面,找到UnityEditor.dll和UnityEngine.dll两个文件。&&然后在类库项目里面添加引用,把这两个dll添加进来&&这时候,我们就可以在类库项目里面using UnityEngine来使用Unity3D的方法了,比如我们这里简单写了个CreateGameObject方法,生成一个名字为“CreateByDll”的gameobject。&&生成dll,放回Unity3D项目里,我们就可以调用这个方法:运行,看到这个叫做“CreateByDll”的物体生成出来了。&&通过以上的说明,我们会发现其实生成自己的dll在Unity3D里面用是很简单的事情。我们还可以添加其他自己写好的类进类库项目,然后生成dll来使用。&最后说一下注意事项了。刚才生成的dll在Unity3D编辑器里面基本上都是能用的,但不一定能通过编译。有可能在编译成exe或者apk等时会报错。需要注意的是,类库项目使用的.Net Framework版本。我自己的尝试是,使用.Net 4.0以上版本发布的dll,在Unity3D里面会编译不通过。所以我们可以用2.0或者3.0之类的版本来发布。&还有一些情况是某些现成的dll动态库是使用完整的.Net2.0来发布的,所以我们在编译的时候有可能需要选择完整的.Net 2.0来发布。到了这一步,我们就可以把Unity3D的整个代码文件夹里面所有的脚本剪切到类库项目里面生成dll,然后放回Unity3D项目里面。这样别人就不能直接的编辑我们项目里面的代码了。不过dll本身是不安全的,别人可以很容易看到里面的内容。下一篇博客我们再说明怎样去给dll做混淆。
阅读(22495)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'Unity3D项目程序加密1——在Unity3D里使用自己的dll',
blogAbstract:'\t如果稍微关注过这方面知识的朋友,应该知道Unity3D做出来的项目是非常容易被反编译的,被反编译后你的所有资源和代码都将会毫无遮掩的呈现出来。由于.net本身没什么加密的措施,所以我们一般都是使用混淆代码的方式来对程序进行一定的加密。\t接下来2篇博客,阿赵将会简单的讲一下我自己在Unity3D的程序加密做法。首先第一篇,我会简单的说明一下怎样在Unity3D里面使用dll动态链接库,然后第二篇会说明怎样对dll进行混淆。',
blogTag:'unity3d,dll,动态库',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:3,
publishTime:9,
permalink:'blog/static/',
commentCount:4,
mainCommentCount:2,
recommendCount:7,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'我是阿赵,请多多指教!',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 vs2010 dll编写和调用 的文章

 

随机推荐