Air调用dll方法示例.doc_第1页
Air调用dll方法示例.doc_第2页
Air调用dll方法示例.doc_第3页
Air调用dll方法示例.doc_第4页
Air调用dll方法示例.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Air调用dll方法示例ANE简介:Ane,Adobe Air Native Extension 的缩写,是指AdobeAir的本地扩展。它的作用是提供基于AdobeAir平台上层开发的as3脚本调用所在的设备功能的接口及方法。swc文件是采用归档格式的ActionScript类库。Swc文件包含swf文件和其资源文件。Swc文件是共享ActionScript类的简便方法。本机扩展是包是一个ANE文件。和swc文件一样,ANE文件也是一个ActionScript类库,包含归档格式的swf文件和其资源文件。不过,ANE文件和swc之间最重要的区别是只有ane文件才能包含本机代码库。一、 创建vc项目打开vs 2005,新建一个MFC DLL项目:将项目编译方式改为Release:FlashRuntimeExtensions.h 文件位置:sdk/include目录下;FlashRuntimeExtensions.lib文件位置:sdk/lib/win 目录下;将FlashRuntimeExtensions.h与FlashRuntimeExtensions.lib拷贝到目录下点击右键Add - Existing Item将FlashRuntimeExtensions.h引用进来点击右键properties打开项目属性,点击 Linker - Input 中第一项Additional Dependencies,将FlashRuntimeExtensions.lib添加进来。打开C/C+ -Precompiled Headers,第一项选择Not Using Precompiled Headers打开ANETest.h,将文件内容修改为:打开ANETest.cpp,如下所示添加方法:先大致介绍下各方法:先是3个工具方法:utf8_to_ansi 将Air传入的utf8中文参数转换c多字节中文getCharLength 获取Char*长度addChar 拼接两个char*然后是我们要修改的方法:sayHello方法是我们这里演示的方法,传入名字,返回Hello, + 名字。eventTest方法是我们这里演示事件的方法,里面调用了eventTestThread线程方法。contextInitializer 是固定的用来注册方法信息的方法,这样Air就可以通过方法名称找到方法体最后3个是固定的初始化和结束的方法:contextFinalizer initializerfinalizer按F7编译通过,稍后我们会详细解释sayHello和eventTest方法二、 创建Air项目新建一个Air项目:在项目下(注意不是在src下)创建如下目录结构:ANETest.dll则是从上面vs 2005编译后产生的,在ANETestrelease目录下:将其拷贝到Air工程extensionssrcwindows目录下。打开extensions.xml这里需要注意的是id会映射到Air项目中的一个as类,nativeLibrary是刚才的dll名称。如下图创建as映射类:这里首先创建了ane上下文,然后写了个sayHello的方法,传入参数name:String,bytes:ByteArray,bytes是用来返回数据用的。eventTest方法则除了bytes,没有其他参数。打开build.xml:这里需要注意的是:第行SDK_HOME4.6 sdk位置第12行 APP_NAMEAir项目名称第21行NATIVE_EXTENSION_NAME打包后ane的名称第22行NATIVE_EXTENSION_ACTIONSCRIPT_CLASSES映射的as类运行ant脚本:成功后会在extensionsbin目录下出现一个ANETestDll.ane右键项目属性,在build path中Native Extensions中将此ane选出来:在build packaging的Native Extensions中打上勾:打开主程序ANETest.mxml,添加输入框、按钮与方法:var bytes:ByteArray = new ByteArray();aneTestDll.sayHello(txtName.text, bytes);var ret:String = bytes.readMultiByte(bytes.length,chinese);Alert.show(ret);这样即可以调用dll中的方法了。为了演示事件,还需要添加事件相关代码:addEventListener(StatusEvent.STATUS, statusHandler);public function statusHandler(e:StatusEvent):voidvar level:String = e.level;var code:String = e.code;Alert.show(code);三、 调用流程首先,看sayHello方法:当按了按钮后,将会创建一个空的ByteArray,并将输入的名称和此ByteArray作为参数调用ANETestDll中的sayHellow方法,ANETestDll中的sayHellow方法则会调用dll中sayHello方法,我们来看c中的sayHellow方法:FREObject sayHello(FREContext ctx, void* funcData, uint32_t argc, FREObject argv)return NULL;所有的自定义方法都使用统一的参数与返回类型。uint32_t strLen;const uint8_t * pName;FREGetObjectAsUTF8(argv0, &strLen, &pName);这里argv0表示传入的第一个参数,以此类推,这里第一个参数就是name,通过这3句可以取到name的值,不过因为Air的字符是UTF8的,而c的字符是多字节,所以需要转换一下:char* name;utf8_to_ansi(char*)pName, name);这样name中就是中文了。因为dll之前的是release方式编译的,要跟代码的话需要改成debug方式,重新编译、打包ane。调试Air,设置断点,然后,在vs中设置断点,在菜单中Tools-Attatch to Process选择adl:这样就可以调试代码了:这里看到name 已经转码成功了。char* hi = Hello, ;char *ret;ret = addChar(hi, name);这里是在名字前加上Hello。FREObject objectByteArray = argv1;FREByteArray byteArray;这里是准备输出,将指针指向第二个参数,也就是byteArray。FREObject length;FRENewObjectFromUint32(getCharLength(ret), &length);FRESetObjectProperty(objectByteArray, (const uint8_t*) length, length, NULL);这3句是获取返回的byteArray的长度,并指定返回长度。FREAcquireByteArray(objectByteArray, &byteArray);memcpy(byteArray.bytes, ret, getCharLength(ret);最后将字节复制到输出byteArray中。FREReleaseByteArray(objectByteArray);最后释放。当byteArray回到Air中后,需要用如下方式转换成UTF8:var ret:String = bytes.readMultiByte(bytes.length,chinese);然后我们看eventTest方法:前面流程没什么特别的,调用了ANETestDll中的eventTest方法,再调用了c里的eventTest方法。context = ctx;_beginthread(eventTestThread, 0, NULL);return NULL;这里启动了线程后,就返回了,所以是一个异步调用的方法。void _cdecl eventTestThread(void* param) _sleep(1000);const uint8_t* msg1 = (const uint8_t*)Hello World; const uint8_t* msg2 = (const uint8_t*)Message; FREDispatchStatusEventAsync(context,msg1,msg2);context = NULL;这里先让线程睡1秒,然后发送消息,msg1是消息中的code,msg2是消息中的level。然后到ANETestDll中,有消息捕获:context.addEventListener(StatusEvent.STATUS,eventHandler);protected function eventHandler(e:StatusEvent):voidFlexGlobals.topLevelApplication.dispatchEvent(e);这里捕获后再将消息抛出,在

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论