关于Binder原理这里不做介绍了,可以参看Android技术内幕,但是关于Binder应用讲解的很详细的不多,因我在做一个移植的项目,与media类似,故研究了一下media,特别对其中的如何实现客户端、服务端才能通过Binder通信进行学习,总结如下:
1、基于接口编程,这是编程的趋势,好处实在太多
2、使得接口支持Binder,需要2步:
2.1定义接口,继承IInterface,并添加DECLARE_META_INTERFACE,并定义服务端接口,如下所示:
class IClient: public IInterface
{
public:
DECLARE_META_INTERFACE(Client);
virtual long Add(long a,long b) = 0;
};
class BnClient:public BnInterface<IClient>
{
public:
virtual status_t onTransact( uint32_t code,
const Parcel& data,
Parcel* reply,
uint32_t flags = 0);
};
2.2 实现客户端和服务端
#define LOG_TAG "IClient"
//#define LOG_NDEBUG 0
#include <utils/RefBase.h>
#include <binder/IInterface.h>
#include <binder/Parcel.h>
#include <IClient.h>
namespace android {
enum {
ADD = IBinder::FIRST_CALL_TRANSACTION
};
class BpClient : public BpInterface<IClient>
{
public:
BpClient(const sp<IBinder>& impl)
: BpInterface<IClient>(impl)
{
}
virtual long Add(long a,long b)
{
Parcel data,reply;
data.writeInterfaceToken(IClient::getInterfaceDescriptor());
data.writeInt32(a);
data.writeInt32(b);
remote()->transact(ADD,data,&reply);
return reply.readInt32();
}
};
IMPLEMENT_META_INTERFACE(Client, "android.test.IClient");
// ----------------------------------
status_t BnClient::onTransact(
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
switch(code) {
case ADD:
{
CHECK_INTERFACE(IClient, data, reply);
reply->writeInt32(Add(data.readInt32(),data.readInt32()));
return NO_ERROR;
};
break;
default:
return BBinder::onTransact(code, data, reply, flags);
}
}
}; // namespace android
3、最后在服务端实现具体类,继承BnClient
Unity3D支持三种脚本,javascript、C# Script、Boo Script(类Python)。我这个人比较二......最初公司这边叫我学C#,我之前不会,所以现学。到了之后才发现,我会的Python是可以派上用场的,而且我也更喜欢Python一些。但这还不是最二的。我发现了一个问题,就是官方的脚本文档基本都是用javascript来给用例的。于是我心一横,就把javascript的基础给过了一遍(这个资料挺不错的)。好吧,最二的来了。后来当我发现官方文档里的这个的时候,我笑了。见下图。
点击这个下拉菜单就可以切换例子的代码的类型......算了,新学一门语言也不错。虽然只懂点皮毛......PS:建议不会编程的童鞋别以JS为第一门语言,很可能会养成不好的习惯哦。特别是在代码风格上面。当然,这里并没有贬低JS的意思。毕竟我现在用它用的很舒服。
亲,如果有概念(比如gameObject之类的概念)上的不懂,请先去看Unity官方的用户手册哈。我看了文档后,我的理解是,脚本和组件没啥区别。下面就直接了当的记录下添加脚本的步骤吧。(方法有很多,我就说一种我最习惯的方法哈)首先,在Project view中点鼠标右键,选Create -> javascript(别的也行),以下由图说明。
添加之后,在Project view里出现的脚本文件,双击之后即可编辑。
把Project view中的脚本文件拖拽到你想通过脚本来控制的对象(gameObject)上,之后脚本会以类似组件的形式,出现在对象的Inspector窗口中。
嘿嘿,具体脚本的编写,就看自己的水平咯。有啥不懂就上网、自己研究、或者看看官方的脚本文档。
Qwt安装
=======
安装 =======
Qwt使用qmake编译所有的组件和示例。
qmake是Qt发布中的一部分。
qmake读取工程文件,工程文件包含了如何工程选项和如何编译特定工程的规则。一个工程文件是以"*.pro"结尾的。
以"*.pri"结尾的文件都是被工程文件包含的,该文件包含了几个工程文件通用的定义。
qwtconfig.pri和qwtbuild.pri被Qwt包中的所有工程读取。q当你编译自己的应用程序时,qwtconfig.pri同样被qwt.prf读取。
因此第一步就是编辑*.pri文件使其满足你的需求。
qmake的子目录template是解决在路径名中使用空格的情况。因此最好不要在包含空格的路径名下编译Qwt。(否则你可能就需要
在所有的子目录下手动的运行qmake)。
======
文档 ======
Qwt包含了一个类文档,提供了该文档的多种格式:
-Html文档
-PDF文档
-Qt压缩帮助文档(*.qch),针对Qt assistant或者creator。
你可以通过 "Edit Preferences" -> "Documentation" -> "Add..."加载该文档。
-Man帮助文档(仅UNIX)
======
编译Qwt ======
最简单的编译Qwt的方式就是在命令行中--但是如果你坚持使用IDE,那么就请别忘记"make install"这一步。
A)Unix
------
qmake
make
make install
如果你已经安装了一个共享库,并且该路径已经被你的操作系的的运行时连接器知道。在Linux系统上读取"man ldconfig"
(或者是通过谷歌搜索它)。另一个选择就是使用LD_LIBRARY_PATH(在一些系统上,使用LIBPATH代替,
在MacOSX是DYLD_LIBRARY_PATH)环境变量。
如果你仅仅是想获取Qwt的示例而不想安装任何东西,那么你可以设置LD_LIBRARY_PATH为你本地编译的库路径。
如果你没有在qwtconfig.pri中使能自动编译示例程序,那么你必须如下编译示例程序:
cd examples
qmake
make
B)Win32/MSVC
------
确保你的Qt版本是使用MSVC编译的--而不是MinGW!
请阅读qmake的文档获知如何将你的*.pro文件转换为适合你的开发环境。
例如:使用MSVC的nmake:
qmake qwt.pro
nmake
nmake install
如果你没有在qwtconfig.pri中使能自动编译示例程序,那么你必须如下编译示例程序:
cd examples
qmake examples.pro
nmake
Windows不会混合调试模式和发布模式的二进制程序。绝大多是使用Qwt设计师插件的问题都是因为试图在发行版本的设计师
程序中加载调试版本的Qwt库。
不可能将使用MinGW编译的设计师插件导入由MSVC编译的Qt Designer/Creator。当使用预先编译好的Qt Creator时,那是一个
常见的问题。
C)Win32/MinGW
------
确保你的Qt版本是使用MinGW编译的--而不是MSVC!
在安装了Qt的环境下启动一个Shell。(例如"Programs->Qt by Trolltech ...->Qt 4.x.x Command Prompt")。
确保你可以执行"make"或者是其它类似"mingw32-make"的命令。
qmake qwt.pro
make
make install
如果你没有在qwtconfig.pri中使能自动编译示例程序,那么你必须如下编译示例程序:
cd examples
qmake examples.pro
make
Windows不会混合调试模式和发布模式的二进制程序。绝大多是使用Qwt设计师插件的问题都是因为试图在发行版本的设计师
程序中加载调试版本的Qwt库。
不要忘记告诉qmake在哪里查找qwt.prf:
qmake -set QMAKEFEATURES ...
D)MacOSX
------
好吧,其实Mac是另一个Unix系统。因此请阅读A)中的安装步骤。
在最近发布的Qt4发行版本中,qmake默认的目标是生成XCode过程文件而不是makefiles。因此你可能需要如下操作:
qmake -spec macx-g++
...
E)Qt Embedded
------
我仅仅在Linux系统上的qvfb(Virtual Framebuffer Devivce)模拟器中测试了Qwt在Qt Embedded环境下运行。为模拟器编译Qwt
就如同为一般的Unix编译一样简单。
F)Symbian
------
我从未在该平台上测试过。
======
使用Qwt ======
使用qmake编译一个Qwt程序使用Qwt配置的特性,这些特性已经使用"make install"安装了。当qmake 可以找到它
(http://doc.qt.nokia.com/4.7/qmake-advanced-usage.html#adding-new-configuration-features)你可以仅仅在你自己的
工程文件中加入"CONFIG += qwt"。
如果你不使用qmake,你就必须在你编译器选项中设置Qwt的头文件路径,并且将Qwt的库路径添加到你连接器列表中。
当你在Windows上使用Qwt-DLLS时,不要忘记将QWT_DLL添加到你的编译器标志中。
当你使用Qwt设计师插件时,你需要配置你的Qt designer/creator使得它们可以找到这些插件。这可以通过设置QT_PLUGIN_PATH
或者是使用一个qt.conf文件(查看http://doc.qt.nokia.com/4.7/deployment-plugins.html)。除了插件外,Qwt的库文件本身也
需要被Designer/Creator知道(可以设置LD_LIBRARY_PATH, PATH ...)。
祝你好运!