flashdevelop调用ios方法

来源:http://blog.csdn.net/zu12jing/article/details/7331397

flash开发工具用的是flashdevelop(由于flashdevelop还能直接打开flashbuilder工程,反过来就不知道了)

一.创建工程

创建一个ios的工程,这个网上很多资料我就不写了

关键点:要打包到ios设备上主要要看默认的AIR_IOS_readme.txt文件说明,这样对打包ios工程设置讲的非常详细

二.怎么使用ane(ane封装后面补上)

ane:包括了所有的所有跨平台所需要的资源

三、lib.a文件生成(环境 xcode4.2)

1,启动Xcode,在IOS-》Frameworkd&Library下面,创建一个Cocoa Touch Static Library的项目。
2,创建好之后,从你下载的flex SDK目录下,找到Include文件夹,找到里面的FlashRuntimeExtensions.h添加到工程中
3,可以把系统默认生成.h文件删除,留一个.m的文件就行了
4,下面是.m文件的内容

#import "FlashRuntimeExtensions.h"
#import <AudioToolbox/AudioToolbox.h>
#import <UIKit/UIKit.h>

FREObject ShowIconBadageNumber(FREObject ctx, void* funcData, uint32_t argc, FREObject argv[])
{
NSLog(@"entering in ShowIconBadageNumber()");
FREObject fo;
FRENewObjectFromBool(NO, &fo);
NSLog(@"entering in ShowIconBadageNumber()");

int32_t t;
FREGetObjectAsInt32(argv[0], &t);

[[UIApplication sharedApplication] setApplicationIconBadgeNumber:t];

return argv[0];
}

FREObject ShowAlertInfo(FREObject ctx, void* funcData, uint32_t argc, FREObject argv[])
{
NSLog(@"entering ShowAlertInfo()");

FREObject fo;
FRENewObjectFromBool(NO, &fo);

int32_t t;
FREGetObjectAsInt32(argv[0], &t);

NSString *tmpStr = [NSString stringWithFormat:@"%d", t];

UIAlertView *tmpAlert = nil;
tmpAlert = [[UIAlertView alloc] initWithTitle:@"系统信息" message:tmpStr delegate:nil cancelButtonTitle:@"sure" otherButtonTitles: nil];
[tmpAlert show];
[tmpAlert release];

NSLog(@"Exiting ShowAlertInfo()");
return  argv[0];
}

FREObject InitNativeCode(FREObject ctx, void* funcData, uint32_t argc, FREObject argv[])
{
NSLog(@"Entering InitNativeCode()");
    
NSString *tmpStr = [NSString stringWithFormat:@"%d", 10000];

UIAlertView *tmpAlert = nil;
tmpAlert = [[UIAlertView alloc] initWithTitle:@"系统信息" message:tmpStr delegate:nil cancelButtonTitle:@"sure" otherButtonTitles: nil];
[tmpAlert show];
[tmpAlert release];
    // Nothing to do.
    
    NSLog(@"Exiting InitNativeCode()");
    
    return NULL;
}

void ContextInitializer(void* extData, const uint8_t* ctxType, FREObject ctx, uint32_t* numFunctionsToTest, const FRENamedFunction** functionsToSet)
{
NSLog(@"entering contextInitializer");
*numFunctionsToTest = 3;
FRENamedFunction *func = (FRENamedFunction *)malloc(sizeof(FRENamedFunction) * 3);

func[0].name = (const uint8_t*)"InitNativeCode";
func[0].functionData = NULL;
func[0].function = &InitNativeCode;

func[1].name = (const uint8_t*)"ShowIconBadageNumber";
func[1].functionData = NULL;
func[1].function = &ShowIconBadageNumber;

func[2].name = (const uint8_t*)"ShowAlertInfo";
func[2].functionData = NULL;
func[2].function = &ShowAlertInfo;

*functionsToSet = func;
NSLog(@"exiting contextInitializer");
}
void ContextFinalizer(FREObject ctx)
{
NSLog(@"Entering ContextFinalizer()");
    
    // Nothing to clean up.
    
    NSLog(@"Exiting ContextFinalizer()");
}

void ExtInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet, FREContextFinalizer* ctxFinalizerToSet)
{
NSLog(@"Entering ExtInitializer()");
    
*extDataToSet = NULL;
*ctxInitializerToSet = &ContextInitializer;
*ctxFinalizerToSet = &ContextFinalizer;
    
    NSLog(@"Exiting ExtInitializer()");

}
void ExtFinalizer(void *extData)
{
NSLog(@"Entering ExtFinalizer()");
    
    // Nothing to clean up.
    
    NSLog(@"Exiting ExtFinalizer()");
    return;
}

前面两个函数是自己写的借口,后面是通用的借口,在红色标记的函数里记得要开辟你所写接口的数量,我就是少了一个一直调用接口函数失败,在工程设置里记得将Enable linking with shared libraried设置成NO,现在就可以生产.a文件了

四.生产.swc接口文件(flash builder4.6)

创建flex库项目,点击工程属性,flex库构建路径-》资源,选择src确定,swc就生产了,下面是代码(注:有时候由于flex版本问题要在flex库编译器选项卡的附加编译器参数你加入-swf-version 13)

package com.coolexp
{
import flash.external.ExtensionContext;

public class aneFlex
{
private static var extContext:ExtensionContext = null;

public function aneFlex()
{
showBadageNum(100);
}

public static function showBadageNum(num:int):int
{
if(!extContext)
{
initExtension();
}

return int(extContext.call("ShowIconBadageNumber", num));
}

public static function showAlertInfo(num:int):int
{
if(!extContext)
{
initExtension();
}

return int(extContext.call("ShowAlertInfo", num));
}

public static function initExtension():void
{
trace("vibration constructor: create an extension context");
extContext = ExtensionContext.createExtensionContext("com.coolexp.aneFlex", "");
extContext.call("InitNativeCode");

extContext.call("ShowAlertInfo", 20);
}

}
}

五、打包.ane文件

将生成的.a和.swc文件拷贝到同一个目录下,复制一份.swc文件将后缀名改成.zip解压将里面的两个文件拷贝出来放于.a文件同一文件夹(就是这个目录下目前有四个文件.a,.swc,.swf,.xml),创建一个extension.xml文件(内容如下),com.coolexp.aneFlex这个id要和flex 库工程的id一样,libAneDemo.a是你生成.a文件的名字。然后找到你flex库中adt文件位置执行下面蓝色命令打包就成

<extension xmlns="http://ns.adobe.com/air/extensin/2.7">
<id>com.coolexp.aneFlex</id>
<versionNumber>1</versionNumber>
<platforms>
<platform name="iphone-ARM">
<applicationDeployment>
<nativeLibrary>libAneDemo.a</nativeLibrary>
<initializer>ExtInitializer</initializer>
<finalizer>ExtFinalizer</finalizer>
</applicationDeployment>
</platform>
</platforms>
</extension>

打包.ane命令

"D:\flex sdk\4.6.0\bin\adt" -package -target ane aneDemo.ane extension.xml -swc AneFlex.swc -platform iPhone-ARM library.swf libAneDemo.a

这样在文件夹下就会产生一个aneDemo.ane文件了

六,调用.ane(flashdevelop 工程)

复制ane文件到lib目录下,添加到库并设置成外部应用库。在packager.bat中加入-extdir lib/

例:call adt -package -target %TYPE%%TARGET% %OPTIONS% %SIGNING_OPTIONS% "%OUTPUT%" "%APP_XML%" %FILE_OR_DIR%-extdir lib/

由于是extdir lib目录所以要把.ane文件放入lib文件夹下

在as3工程属性设置中的extensions选项卡中加入com.coolexp.aneFlex    id

这个在你的as3工程里就能调用.ane的库,实现后才发现不能联机编译的,直接生产.ipa包装到ipad上成功运行

注意:要生成.apk或者.ipa包的时候才能用.ane,不然在模拟器上嵌入ane会认不到ane里面配置的id,编译会报错

flashdevelop调用ios方法,布布扣,bubuko.com

时间: 2024-08-10 23:20:58

flashdevelop调用ios方法的相关文章

IOS问题汇总:2015-1-9 IOS之NSArray 中调用的方法详解(转)

IOS之NSArray 中调用的方法详解 下面的例子以 NSArray *array = [NSArray arrayWithObjects:@“wendy”,@“andy”,@“tom”,@“jonery”,@“stany”, nil];1.获取数组中总共有多少个对象. -(NSUInteger)count; NSLog(@“%d”,[array count]); 2 2.获取数组中下标对应的元素对象.(下标是从0开始) -(id)objectAtIndex:(NSUInteger)index

【iOS和HTML 5交互】iOS中加载html5调用html方法和修改html5内容

近期项目开发中用到了这方面的技术了,那我们一起来看看. 1.利用webView控件加载本地html5或者网络上html5 2.设置控制器为webView的代理,遵守协议 3.实现代理方法webViewDidFinishLoad: 4.在代理方法中进行操作HTML5中的标签(CRUD-->增删改查) 1.用类选择器或者id选择器或者标签选择器等选择要进行操作的标签 2.把选择好的标签转换成字符串 3.webView调用stringByEvaluatingJavaScriptFromString方法

iOS实现调用动态方法名有返回值的方法

需求: 有10个类, 每个类里头都有n个方法(前提是方法名有规律可循,比如 setA0,setA1-)  如果挨个去init类, 然后挨个调用方法,这样你一天就不用干别的了 简单的解决方法可以参考这个: iPhone开发中,动态调用类和方法 虽然说performSelector有返回值,但是在ARC下会有警告,因为方法名是动态的,系统并不知道返回值是什么样的类型.解决方法可以见这篇文章: "performSelector may cause a leak because its selector

安卓ios和angularjs相互调用解决首次调用ios传递标题失败的问题

1.angular 调用客户端方法放在 try catch中 try { js_invoke.showShareDialog(angular.toJson(obj));  // 在这里放客户端的方法即可 } catch(e) { console.log('Recommend share',obj); } 2.客户端调用angular的方法,注意方法需全局可以才能正常调用 在首页index.html中声明方法 var goBack = function() { return false }; 在具

Phonegap 之 iOS银联在线支付(js调用ios端银联支付控件)

Phonegap项目,做支付的时候,当把网站打包到ios或android端成app后,在app上通过wap调用银联在线存在一个问题: 就是当从银联支付成功后,再从服务器返回到app客户端就很难实现. wap银联支付流程是这样:客户端---> 服务器(构建支付请求)--> 银联支付 ---> 返回到服务端(处理支付结果).所以对于手机网站银联支付没有问题,但是对于ios端app和android端app, 再通过wap支付,发现支付成功后,很难在回到app客户端了. 所以这里就必须借助Pho

UIWebView中Html中用JS调用OC方法及OC执行JS代码

1.HTML页面 1 <html> 2 3 <head> 4 5 <title>HTML中用JS调用OC方法</title> 6 7 <meta http-equiv="Content-Type"content="text/html; charset=UTF-8"> 8 9 <script> 10 11 function test() 12 13 { 14 15 alert("test

JS调用App方法及App调用JS方法

做App内嵌H5项目时,经常会遇到js与App的交互,最普遍的就是方法的互相调用,那么如何实现方法的互相调用呢? 写在前面: 如果只是小项目且后期扩大的可能性不大的时候,可以忽略,可如果是长期项目的话,那么就需要考虑以下一些问题了. 1. 方法命名规范. 如果考虑到以后会有大量的方法,那么规范化的命名就很重要了,规范化的命名,既保证了名字的唯一性又保证了代码的可读性方便开发过程,也方便后期维护.   举个栗子,  如果现在有一个方法,是关闭webview, js调用app的方法, 如果直接叫cl

如何在android平台上使用js直接调用Java方法[转]

转载自:http://www.cocos.com/docs/html5/v3/reflection/zh.html #如何在android平台上使用js直接调用Java方法 在cocos2d-js 3.0beta中加入了一个新特性,在android平台上我们可以通过反射直接在js中调用java的静态方法.它的使用方法很简单: var o = jsb.reflection.callStaticMethod(className, methodName, methodSignature, parame

react-native 调用原生方法

基于RN0.40. MyNativeModule.java package com.www; //路径名字 import android.content.Context; import android.widget.Toast; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.faceb