FINALIZERh幼儿园小游戏戏哪有?

所有文章 - ImportNew - Part 115
在这篇文章中,我们来了解一下让代码变得高效的五种技巧,这些技巧可以使我们的垃圾收集器(GC)在分配内存以及释放内存上面,占用更少的CPU时间,减少GC的开销。当内存被回收的时候,GC处理很长时间经常会导致我们的代码中断(又叫做”stop the world”)。
定制高速缓存解决方案是一件非常有趣的事情,它似乎是改善应用程序整体性能的最简单的方式。然而,超高速缓存是一项很大的技术难题,在实践之前需要注意几个事项。
ImportNew有意征集希望第一时间学习Java 8的Java开发者,分别实践其中的新特性,然后通过实例演示分享。
这是介绍Apache HBase系列文章的第五篇。第四篇中,我们使用了Java API来与HBase进行交互,如建表,按行主键查询数据,表扫描。本文将讨论在HBase中如何设计结构。
曾几何时,微软是木马软件开发者最青睐的攻击目标。万不得已,微软增强了Windows系统的安全性,致使攻击者们又转向了更容易攻击的平台。在这样的情况下,Adobe曾经当了一段时间的被攻击主角,不过后来Adobe也追随微软的脚步,增强了软件的安全性。根据2014年IBM X-Force信息威胁季度报告显示:目前攻击者们最喜欢攻击的目标是——Java。
自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分。开发过程中,我们也时常在应用代码中会看到诸如@Override,@Deprecated这样的注解。这篇文章中,我将向大家讲述到底什么是注解,为什么要引入注解,注解是如何工作的,如何编写自定义的注解(通过例子),什么情况下可以使用注解以及最新注解和ADF(应用开发框架)。这会花点儿时间,所以为自己准备一杯咖啡,让我们来进入注解的世界吧。
Java的一些特性会让初学者感到困惑,但在有经验的开发者眼中,却是合情合理的。例如,新手可能不理解Object类。这篇文章讲解了跟Object类及其方法有关的问题。
在这篇文章中我们将会用个实例来学习工厂方法。
在Swing中,密码域(JPasswordField)用getPassword()函数(用来返回char[])取代getText()函数(返回字符串)。在工作中我得到类似的建议是不要用字符串去处理密码相关的问题,为什么涉及到密码问题时字符串会对安全构成威胁呢
本教程将带领你一步一步地认识这门语言的新特性。通过简单明了的代码示例,你将会学习到如何使用默认接口方法,Lambda表达式,方法引用和重复注解。看完这篇教程后,你还将对最新推出的API有一定的了解,例如:流控制,函数式接口,map扩展和新的时间日期API等等。
我从来没有想到我可以看到一个差劲的正则式造成一台服务器没有响应。但它偏偏就在我们的一个服务器上面发生了,结果导致了它毫无响应。
当我们添加越多的测试用例,就越频繁地遇到单元测试执行不稳定的问题。在这篇文章中,我会展示我们是怎么找出这些特定的失败测试的根因,并且由此得出的对测试环境友好的单元测试设计的最佳实践。
当你Google”notify()和notifyAll()的区别”时,会有大片的结果弹出来,(这里先把jdk的javadoc文档那一段撇开不说),所有这些搜索结果归结为等待的线程被唤醒的数量:notify()是唤醒一个, 而notifyall()是唤醒全部.那他们的真正区别是什么呢?
Lambdas 表达式是Java8中非常重要的一部分。我们不要忘记添加到库中的所有的新特性。本文中我将会给大家演示用ConcurrentHashMap类和lambda表达式实现一个本地缓存。
Java线程是执行某些任务的轻量级进程。Java通过Thread类提供多线程支持,应用可以创建并发执行的多个线程。 应用中有两类线程——用户线程和守护线程。当启动应用时,main线程是创建的第一个用户线程,我们可以创建多个用户线程和守护线程。当所有用户进程执行完毕时,JVM终止程序。 可以对不同的线程设置不同的属性,但并不保证高优先级的线程在低优先级线程之前执行。线程调度器是操作系统的部分实现,当一个线程启动后,它的执行被线程调度器控制,JVM不会控制它的执行。 可通过扩展Thread类实现的Runnable接口创建线程。
该系列将随着更多线程教程文章的发表而持续增加,所以请保存为书签,以备将来需要。 请让通知我们是否遗漏了你想学习的指示。
是的,因为安全性的问题,Java近年来饱受媒体的诟病。是的,马上就要release的Java 8在功能特性上有所削减,而且已经跳票了。不过这些都不能阻止开发者们拥抱这个全新的版本,最新的网上调查可以证明这一点。
我们的一个程序,假设名字为“Photo Pull”,主要解决以下问题:从各种第三方来源上获取联系人照片,将照片重新调整至所需的缩略图大小,将结果发送到S3。看起来似乎这个程序能够理所当然的稳定运行.但事实刚好与之相反,这是我们最容易出问题的程序之一——不是因为代码有问题,而是Java运行时会导致问题……
当你开始接触一个新的平台时,都会从做同一件事开始,通常你会根据你已学的概念或者框架来尝试快速搭建它,但是你无从下手,因为它们通常以全新的名字和方法展现在你面前。
走完这个过程非常耗时,有时甚至让人一筹莫展。这篇指南正是用来帮助那些新手避免此类问题的。
我们开创OSCON Java的一个主要原因就是:Java的开源生态体系是健壮、健康的。在过去的十年间,有几个项目已经被广泛接受,而且在Java的世界中产生了深远影响,深入到软件开发,其中有的甚至与用户的日常生活息息相关。让我们来看看这七个改变世界的Java项目吧。
Lambda表达式是目前Java8最酷的特性之一。但我认为还有一项秘密武器类似于“语法糖”在提升代码可读性和可塑性很强大。当你使得代码更富有表现力时,它可以使你的任务中最困难的部分简单化,且能够表现更深的含义。
还有最后那个例子,应该用static变量,不然两个线程操作啥。。
关于ImportNew
ImportNew 专注于 Java 技术分享。于日 11:11正式上线。是的,这是一个很特别的时刻 :)
ImportNew 由两个 Java 关键字 import 和 new 组成,意指:Java 开发者学习新知识的网站。 import 可认为是学习和吸收, new 则可认为是新知识、新技术圈子和新朋友……
新浪微博:
推荐微信号
反馈建议:ImportNew.
广告与商务合作QQ:
– 好的话题、有启发的回复、值得信赖的圈子
– 写了文章?看干货?去头条!
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 活跃 & 专业的翻译小组
– 国内外的精选博客文章
– UI,网页,交互和用户体验
– JavaScript, HTML5, CSS
– 专注Android技术分享
– 专注iOS技术分享
– 专注Java技术分享
– 专注Python技术分享
& 2018 ImportNewjava程序员
十三、JDK的命令行工具
前面的博文我们介绍了一些关于jvm的一些基础知识,本文介绍一些jdk的命令行工具,通过这些工具我们可以对运行日志、异常堆栈、GC日志、线程快照(threaddump/javacore 文件)、堆转储快照(heapdump/hprof 文件)等文件进行分析,从而定位解决问题。
jdk的彬目录中有许多命令行工具,其中java.exe、javac.exe这两个命令行工具是我们最熟悉的。同时,还有其他的许多命令行工具,我们今天介绍的就是这些命令行工具中的一部分。bin目录内容如下图所示。
本文介绍的主要jdk命令:
JVM Process Status Tool
显示指定系统内所有的HotSpot虚拟机进程
JVM Statistics Monitoring Tool
用于收集Hotspot虚拟机各方面的运行数据
Configuration Info for Java
显示虚拟机配置信息
JVM Memory Map
生成虚拟机的内存转储快照,生成heapdump文件
JVM Heap Dump Browser
用于分析heapdump文件,它会建立一个HTTP/HTML服务器,让用户在浏览器上查看分析结果
JVM Stack Trace
显示虚拟机的线程快照
jps:虚拟机进程状况工具
jps命令是最常用的命令,可用于查询正在运行的虚拟机进程,同时可选择性的显示虚拟机执行主类,即执行main函数的类,以及进程的本地虚拟机ID(Local Virtual Machine Identifier 简称LVMID)(对于本地虚拟机进程来说,进程的本地虚拟机ID与的进程ID是一致的)。
jps的命令格式为:
[options] [hostid]
jps中 options 的主要选项如下所示。
只输出本地虚拟机进程ID,省略主类名
输出虚拟机进程启动时传递给main()函数的参数
输出进程执行的主类的全名
输出虚拟机进程启动时的JVM参数
* hostid可用于查询开启了RMI服务的远程虚拟机进程状态,hostid为RMI注册表中注册的主机名。
2. jstat:虚拟机统计信息监视工具
jstat命令可用于显示本地或远程虚拟机进程中的类装载 ,内存,垃圾收集,JIT编译等运行数据。再没有GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。
jps的命令格式为:
[interval[s|ms]]
其中若查询的是本地虚拟机进程,VMID与LVMID是一致的,如果是远程虚拟机进程VMID的格式为:
[protocol:][//] lvmind[@hostname [:port] /servername]
参数interval和count代表查询的间隔和次数,如果省略这两个参数,说明只能查询一次。假设需要每150毫秒查询一次进程2764垃圾收集的状况,一共查询20次,那命令应当是:
jstat -gc 2764 250 20
选项options代表着用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集、运行期编译状况,具体选项及作用请参考下表的描述:
监视类装载,卸载数量,总空间以及类装载所耗费的时间
监视Java堆状况,包括Eden区,两个survivor区,老年代,永久代的容量,已用空间,GC时间合计等信息
-gccapacity
内容与-gc基本相同,但主要输出Java堆各个区域的最大最小空间
内容与-gc基本相同,但主要关注已使用空间占总空间的百分比
内容与-gcutil基本相同,但主要关注已使用空间占总空间的百分比,并输出导致上一次GC的原因
监视新生代GC情况
-gcnewcapacity
内容与-gcnew基本相同,但主要输出使用到的最大最小空间
监视老年代GC情况
-gcoldcapacity
内容与-gcnew基本相同,但主要输出使用到的最大最小空间
-gcpermcapacity
输出永久代使用到的最大最小空间
输出JIT 编译器编译过的方法耗时的信息
-printcompliter
输出已经被JIT编译的方法
其中S0,S1表示Survivor区,E表示新生代Eden区,O表示老年代(Old),P表示永久代(Permanent)。YGC(Young GC)表示MInor GC,其下面的数字表示GC了多少次,YGCT(Young GC Time)表示Minor GC的耗时,单位为秒,FGC表示Full GC的次数,FGCT表示Full GC的耗时,单位为秒,GCT表示总共的GC时间,为YGCT与FGCT的总和。
jinfo用于实时地查看和调整虚拟机的各项参数。
jinfo的命令格式为:
jinfo [option] pid
option选项的具体内容如下所示:
把虚拟机进程的System.getProperties()的内容打印出来
打印出名为name的value值
启用或禁用虚拟机参数
修改运行期的虚拟机的参数值
打印虚拟机启动时未被显示指定的所有系统默认值
打印帮助信息
我们可以用jinfo -flags来查询线程的参数,其中的Non-default VM flags为虚拟机默认的设置参数,Command line为用户自行设置的参数,如下图:
4. jmap:Java内存映像工具
jmap 命令一般用于生成堆转储快照(一般称为heapdump 或 dump 文件)。且可以查询finalize执行队列,Java堆与永久代的一些信息。
* jmap的命令格式为:*
常用的option选项有:
生成Java堆转储快照,格式为: -dump:[live , ]format=b , file=,其中live子参数说明只dump出存活的对象显示在F-Queue中等待Finalizer线程执行finalize方法的对象
-finalizerinfo
显示在F-Queue中等待Finalizer线程执行finalize方法的对象
显示Java堆详细信息,如使用哪种回收器,参数配置,分代状况等
5. jhat:虚拟机堆转储快照分析工具
jhat命令可以与jmap搭配使用,来分析jmap生成的堆转储快照。生成dump文件的分析结果后,可以在浏览器中查看。
该命令一般不会被使用。原因是因为有更好可以替代的工具。
6. jstack:Java堆栈跟踪工具
jstack命令用于生成虚拟机当前时刻的线程快照。线程快照指的是当前虚拟机内的每一条线程正在执行的方法堆栈的集合,生成线程快照的作用是,可用于定位线程出现长时间停顿的原因,如线程间死锁,死循环,请求外部资源导致的长时间等待等问题,当线程出现停顿时 就可以用jstack各个线程调用的堆栈情况。
jstack命令格式:
[option] vmid
常用的option选项有:
当正常输出的请求不被响应时,强制输出线程堆栈
除堆栈外,显示关于锁的附加信息
如果调用到本地方法的话,可以显示C/C++的堆栈
没有更多推荐了,
(window.slotbydup=window.slotbydup || []).push({
id: '5865577',
container: s,
size: '300,250',
display: 'inlay-fix'Grand Finale – Audio Finalizer_腾讯视频
三倍流畅播放
1080P蓝光画质
新剧提前看
1080P蓝光画质
纯净式无框播放器
三倍流畅播放
扫一扫 手机继续看
下载需先安装客户端
{clientText}
客户端特权:
3倍流畅播放
当前播放至 {time}
扫一扫 手机继续看
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要狂奔在雕刻大脑和身体的道路上乐此不疲
finalize()
注:本文的目的并不是鼓励使用finalize方法,而是大致理清其作用、问题以及GC执行finalize的过程。
1. finalize的作用
finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法。finalize()与C++中的析构函数不是对应的。C++中的析构函数调用的时机是确定的(对象离开作用域或delete掉),但Java中的finalize的调用具有不确定性不建议用finalize方法完成“非内存资源”的清理工作,但建议用于:① 清理本地对象(通过JNI创建的对象);② 作为确保某些非内存资源(如Socket、文件等)释放的一个补充:在finalize方法中显式调用其他资源释放方法。其原因可见下文[finalize的问题]
2. finalize的问题
一些与finalize相关的方法,由于一些致命的缺陷,已经被废弃了,如System.runFinalizersOnExit()方法、Runtime.runFinalizersOnExit()方法System.gc()与System.runFinalization()方法增加了finalize方法执行的机会,但不可盲目依赖它们Java语言规范并不保证finalize方法会被及时地执行、而且根本不会保证它们会被执行finalize方法可能会带来性能问题。因为JVM通常在单独的低优先级线程中完成finalize的执行对象再生问题:finalize方法中,可将待回收对象赋值给GC Roots可达的对象引用,从而达到对象再生的目的finalize方法至多由GC执行一次(用户当然可以手动调用对象的finalize方法,但并不影响GC对finalize的行为)
3. finalize的执行过程(生命周期)
(1) 首先,大致描述一下finalize流程:当对象变成(GC Roots)不可达时,GC会判断该对象是否覆盖了finalize方法,若未覆盖,则直接将其回收。否则,若对象未执行过finalize方法,将其放入F-Queue队列,由一低优先级线程执行该队列中对象的finalize方法。执行finalize方法完毕后,GC会再次判断该对象是否可达,若不可达,则进行回收,否则,对象“复活”。
(2) 具体的finalize流程:
对象可由两种状态,涉及到两类状态空间,一是终结状态空间&F = {unfinalized, finalizable, finalized};二是可达状态空间&R = {reachable, finalizer-reachable, unreachable}。各状态含义如下:
unfinalized: 新建对象会先进入此状态,GC并未准备执行其finalize方法,因为该对象是可达的finalizable: 表示GC可对该对象执行finalize方法,GC已检测到该对象不可达。正如前面所述,GC通过F-Queue队列和一专用线程完成finalize的执行finalized: 表示GC已经对该对象执行过finalize方法reachable: 表示GC Roots引用可达finalizer-reachable(f-reachable):表示不是reachable,但可通过某个finalizable对象可达unreachable:对象不可通过上面两种途径可达
状态变迁图:
变迁说明:
新建对象首先处于[reachable, unfinalized]状态(A)随着程序的运行,一些引用关系会消失,导致状态变迁,从reachable状态变迁到f-reachable(B, C, D)或unreachable(E, F)状态若JVM检测到处于unfinalized状态的对象变成f-reachable或unreachable,JVM会将其标记为finalizable状态(G,H)。若对象原处于[unreachable, unfinalized]状态,则同时将其标记为f-reachable(H)。在某个时刻,JVM取出某个finalizable对象,将其标记为finalized并在某个线程中执行其finalize方法。由于是在活动线程中引用了该对象,该对象将变迁到(reachable, finalized)状态(K或J)。该动作将影响某些其他对象从f-reachable状态重新回到reachable状态(L, M, N)处于finalizable状态的对象不能同时是unreahable的,由第4点可知,将对象finalizable对象标记为finalized时会由某个线程执行该对象的finalize方法,致使其变成reachable。这也是图中只有八个状态点的原因程序员手动调用finalize方法并不会影响到上述内部标记的变化,因此JVM只会至多调用finalize一次,即使该对象“复活”也是如此。程序员手动调用多少次不影响JVM的行为若JVM检测到finalized状态的对象变成unreachable,回收其内存(I)若对象并未覆盖finalize方法,JVM会进行优化,直接回收对象(O)注:System.runFinalizersOnExit()等方法可以使对象即使处于reachable状态,JVM仍对其执行finalize方法
4. 一些代码示例
(1) 对象复活
public&class&GC&{&&
&&&&public&static&GC&SAVE_HOOK&=&null;&&
&&&&public&static&void&main(String[]&args)&throws&InterruptedException&{&&
&&&&&&&&SAVE_HOOK&=&new&GC();&&
&&&&&&&&SAVE_HOOK&=&null;&&
&&&&&&&&System.gc();&&
&&&&&&&&Thread.sleep(500);&&
&&&&&&&&if&(null&!=&SAVE_HOOK)&{&&&
&&&&&&&&&&&&System.out.println(”Yes&,&I&am&still&alive”);&&
&&&&&&&&}&else&{&&
&&&&&&&&&&&&System.out.println(”No&,&I&am&dead”);&&
&&&&&&&&}&&
&&&&&&&&SAVE_HOOK&=&null;&&
&&&&&&&&System.gc();&&
&&&&&&&&Thread.sleep(500);&&
&&&&&&&&if&(null&!=&SAVE_HOOK)&{&&
&&&&&&&&&&&&System.out.println(”Yes&,&I&am&still&alive”);&&
&&&&&&&&}&else&{&&
&&&&&&&&&&&&System.out.println(”No&,&I&am&dead”);&&
&&&&&&&&}&&
&&&&@Override&&
&&&&protected&void&finalize()&throws&Throwable&{&&
&&&&&&&&super.finalize();&&
&&&&&&&&System.out.println(”execute&method&finalize()”);&&
&&&&&&&&SAVE_HOOK&=&this;&&
(2)覆盖finalize方法以确保资源释放
作为一个补充操作,以防用户忘记“关闭“资源,JDK中FileInputStream、FileOutputStream、Connection类均用了此”技术“,下面代码摘自FileInputStream类
protected&void&finalize()&throws&IOException&{&&
&&&&if&((fd&!=&null)&&&&&(fd&!=&FileDescriptor.in))&{&&
&&&&&&&&close();&&
12.6 Finalization of Class Instances&
深入理解java的finalize&
The Finalizable Object &
没有更多推荐了,ANE for iOS - 简书
ANE for iOS
你这磨人的小婊子
记录一下最近两天的研究成果,直到写出自己的ANE,网上关于ANE的列子也不少,不知道别人怎么样,我是看的有点云里雾里的,最后参考了好多资料才逐步写出了自己的ANE。
首先创建一个as库项目
里面创建ExtensionContext对象,沟通全靠它了,如果想调用某个方法就call("functionName")一下就好了
开始创建ExtensionContext对象,ExtensionContext.createExtensionContext(ID,null);会返回一个ExtensionContext对象,如果返回值等于null的时候检查一下ID是否一致,这个ID标识符的值与扩展描述符文件中的 id 元素的值相同(后面会用工具帮助我们生成描述文件,但是这个ID必须对应上)
as3 库项目部分 定义了一个简单的功能,检测耳机插入initChectHeadset
public class HelloANE extends EventDispatcher
private var ec:ExtensionContext =
public static const ID:String = "com.xd.hello";
public function HelloANE(target:IEventDispatcher=null)
super(target);
//创建一个ExtensionContext实例,扩展ID需要注意一下,打包的时候会用到
ec = ExtensionContext.createExtensionContext(ID,null);
//添加事件用来监听里面抛出的事件,或者消息用的
ec.addEventListener(StatusEvent.STATUS,onStatus);
* 初始化耳机检测
public function initChectHeadset():void
ec.call("initChectHeadset");
* 耳机检测事件回调,返回耳机状态
protected function onStatus(event:StatusEvent):void
trace("事件回调 \n"+JSON.stringify(event));
在Xcode中创建一个静态库项目
Paste_Image.png
然后要导入Flash的一个头文件叫FlashRuntimeExtensions.h
我的FlashRuntimeExtensions.h文件在这个目录
Paste_Image.png
然后直接拖进去就好了,记得选拷贝
Paste_Image.png
接下来把.m里面的代码都删掉,(.h文件直接可以删掉了)不用上了,然后导入Flash的头文件
然后大概就是酱紫吧
Paste_Image.png
然后初始化这个逗比的扩展吧
这个是在FlashRuntimeExtensions.h文件中定义的初始化签名(就是参数列表),必须按照这个参数列表去实现,方法名随意
Paste_Image.png
这个就是初始化扩展
void initHelloANE(
extDataToSet
FREContextInitializer* ctxInitializerToSet,
FREContextFinalizer*
ctxFinalizerToSet
这个有一个需要注意的地方,就是要调用一个方法的话必须把方法写在调用者之前,不然不能访问,或者提前在上面声明一下
然后初始化一下as要调用的方法签名(就是在as3里面要调用那些方法首先你要在这个地方注册一下)
当然它也有一个规范的,方法签名要一样
typedef void (*FREContextInitializer)(
const uint8_t*
FREContext
numFunctionsToSet,
const FRENamedFunction** functionsToSet
接下来我们去实现这个方法
// as调用的方法签名初始化
void contextInit(
const uint8_t*
FREContext
numFunctionsToSet,
const FRENamedFunction** functionsToSet
// 需要注册的方法的数量
*numFunctionsToSet = 1;
FRENamedFunction *functions = (FRENamedFunction*)malloc(sizeof(FRENamedFunction)* *numFunctionsToSet);
//这边的name就是外面要调用的方法名,要对应的上
functions[0].name = (const uint8_t *)"initChectHeadset";
functions[0].functionData = NULL;
//这个是ANE里面需要执行的方法名(有点类似于一个映射,调用外面的方法,然后映射到里面具体的方法)
functions[0].function = &initChectH
//然后将方法列表设置一下
*functionsToSet =
在initChectHeadset方法里面我们就具体去实现我们的功能了,然而它也是规范的,方法签名,可以点进去看他的定义,仍然需要一堆的参数的,然后继续实现它
typedef FREObject (*FREFunction)(
FREContext ctx,
functionData,
initChectHeadset的实现,需要注意的一点FREContext这个东东需要保存一下,后面需要他回传一些参数到调用者的,我们需要在声明一个全局的FREContext对象来保存它,FREObject对象是我们返回出去和传递进来的一个通用对象,而且只能是它
Audio的东西所以需要导入一下头文件#import &AudioToolbox/AudioToolbox.h&
初始化耳机检测
FREObject initChectHeadset(
FREContext ctx,
functionData,
//保存FREContext对象
eventContext =
//下面是耳机的一些检测方法,最后有一个回调audioRouteChangeListenerCallback
AudioSessionInitialize(NULL, NULL, NULL, NULL);
AudioSessionSetActive(YES);
AudioSessionAddPropertyListener(
kAudioSessionProperty_AudioRouteChange,
audioRouteChangeListenerCallback,
return NULL;
实现audioRouteChangeListenerCallback回调方法和上面一样,点进去看看头文件里面是怎么定义的
// kAudioSessionProperty_AudioRouteChange 事件回调
void audioRouteChangeListenerCallback(
inClientData,
AudioSessionPropertyID inID,
inDataSize,
const void *
if (inID != kAudioSessionProperty_AudioRouteChange) {
CFDictionaryRef routeChangeDic = (CFDictionaryRef)inD
CFNumberRef routeChangeReasonRef = CFDictionaryGetValue(routeChangeDic, CFSTR(kAudioSession_AudioRouteChangeKey_Reason));
SInt32 routeChangeR
CFNumberGetValue(routeChangeReasonRef, kCFNumberSInt32Type, &routeChangeReason);
if (routeChangeReason == kAudioSessionRouteChangeReason_OldDeviceUnavailable) {
NSLog(@"没有耳机");
dispatchMsgEvent(@"yes");
}else if(routeChangeReason == kAudioSessionRouteChangeReason_NewDeviceAvailable){
NSLog(@"有耳机");
dispatchMsgEvent(@"no");
接下来是怎么把数据在传递给方法的调用者,也就是传递到as3里面去,可以通过FREDispatchStatusEventAsync这个方法,他可以给as3中发送一个事件,在外面可以监听到
在调用这个方法之前先去看看它的定义,如下:
FREResult FREDispatchStatusEventAsync(
FREContext
const uint8_t* code ,
const uint8_t* level
看见这个方法是需要一个FREContext对象作为参数,我们之前保存的FREContext可以排上用场了,剩下的两个参数是as3中StatusEvent对象的两个属性,可以根据这两个属性做一些判断啥的
在看看dispatchMsgEvent方法的实现吧,在这个里面发送对外的事件,也就是as3能监听到的事件
void dispatchMsgEvent(NSString *msg)
if (eventContext == NULL) {
NSString *eventN
if ([msg isEqualToString:@"yes"] || [msg isEqualToString:@"no"]) {
eventName = @"audioRouteChange";
eventName = @"ordinaryType";
const uint8_t *eventCode = (const uint8_t *)[eventName UTF8String];
const uint8_t *msgCode = (const uint8_t *)[msg UTF8String];
//把事件派发出去,我们在一开始的时候已经添加了?
FREDispatchStatusEventAsync(eventContext, eventCode, msgCode);
Product-&Scheme-&Edit Scheme...
然后设置一下项目的编译配置设置为Release就OK啦
Paste_Image.png
接下来的事情就是编译静态库做最后的打包工作啦
1.开始编译,首先你需要选择一个运行环境,模拟器运行呀还是真机模式,然后command+B,木有报错就OK了
Paste_Image.png
如果编译成功就会生成黄色框中的.a文件(红色的名字说明还没编译或者没有编译成功)
编译成功就是这样的:
Paste_Image.png
选中.a文件然后右键 Show in Finder 就可以打开这个文件的目录,妈妈再也不用担心我找不到这个文件啦
2.打包ANE文件,把编译好的.a文件然后在打包成.ane文件,然后在通过as3调用,打包我们使用一个好人开发的一个打包工具,能帮我们剩好多事情,闪亮登场 ?????
Paste_Image.png
接下来配置一下,然后生成.ane文件,准备几个文件
swc文件,这个文件是之前创建的as3库项目生成的swc
.a文件,是刚才通过Xcode创建的编译后的.a
.p12文件,可以自己通过FB创建一个证书
然后开始配置打包工具
swc路径就是之前创建的as3库项目生成的swc的路径
java环境变量的这个路径就是我现在填的
本机扩展配置里面的ID就是之前在提醒注意的那个ID一定要保持一致
版本随便填喽
本机扩展这个是Xcode生成的.a文件路径
Initializer 这个里面填Xcode里面初始化扩展的方法名initHelloANE
如果是真机调试就选真机,模拟器就选模拟器
证书文件这个自己搞搞么好了,还有密码
然后就是到处的ane文件路径啦
填好后大概就是酱紫吧
Paste_Image.png
一切准备就绪后就摁下下面的按钮吧,然后耐心的等待几秒钟,如果输出如下信息则表示打包成功啦,赶快去测试一下ane吧。
Paste_Image.png
创建一个as3手机项目,然后导入打包好的ane文件,看到ane有一个错误,不影响使用效果
Paste_Image.png
然后就简单啦,直接new一个之前as3库里面的类然后直接调用方法就OK
var hello:HelloANE = new HelloANE();
hello.initChectHeadset();
我用的是真机调试,所以直接跑起来(布吉岛为什么我在FB for Mac 打包手机项目直接闪退,然后又切换到Win平台搞的Dome)
注意:有一个东西需要注意的在打包到手机里面的时候需要在构建打包里面把本机扩展里面ANE后面的那个 √ 打上,这下就木有错误啦
Paste_Image.png
接下来就开心的去调用啦,比如下面这样:
Paste_Image.png
这个是StatusEvent事件对象, 里面的level和code也都在里面,后面客官请随意?????
"level": "yes",
"target": {
"actionScriptData": null
"currentTarget": {
"actionScriptData": null
"bubbles": false,
"eventPhase": 2,
"cancelable": false,
"type": "status",
"code": "audioRouteChange"
需要注意的地方:
ANE中的类型和as3是有差异的,所以类型转换的地方需要注意一下
在使用工具打包的时候如果发生错误检查一下ID是否一致,路径是否正确,初始化方法名称是否正确
在初始化签名方法的时候上面的numFunctionsToSet参数是方法的数量
打包的时候记得勾选本地扩展包
构建Xcode项目的是记得选构建环境(真机、虚拟机)
啦啦啦,就酱紫吧......(如需人工帮助请按0)
公司有个Flash的外包项目,现在用户量在稳步增加,公司想集成下UM统计的功能,统计看一下App的活跃情况之类的...外包公司做不来...好吧,自己做调研。因为很多框架都都不在维护ANE的拓展库了,而且网上普遍资料较老,在调研的过程中遇到很多坑,记下一篇给后来之人,防止他们...
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
百战程序员_ Java1573题 QQ群:034603 掌握80%年薪20万掌握50%年薪10万 全程项目穿插, 从易到难,含17个项目视频和资料持续更新,请关注www.itbaizhan.com 国内最牛七星级团队马士兵、高淇等11位十年开发经验专...
Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgbook/spring-boot-reference-guide-zh/details带目录浏览地址:http://www.maoyupeng.com/sprin...
出发 总有人会睁大不可思议的眼睛:一个人、女孩、跨越几个城市,不予理解… 如果说独自出发是我不得已而为之,那么几年的行走令我越来越喜欢上了这样一种仪式,一种告别过去从头开始的勇气,一次回归自然返璞归真的契机,所以无论有多难、多恐惧,我都会选择出发,到路上重新给自己力量。 在...
黄堡文化研究 第315期作者:崔会婷编辑:秦陇华 初中毕业那年,在陈炉中学读了一周高中,上学的感觉至今在我的心里都是很美的,上学下学的路上都不会浪费时间,来回都要背英语单词,那种在课堂上享受我自己学习成果的愉悦感觉谁也无法读懂。可是仅仅读了一周,家里来了家住黄堡镇南凹村的姑...
我是一棵小草,我本来和我的朋友生活在一个美丽的花园里。
我们和人类融合的很好,他们给我们阳光,雨水,肥料,我们带给他们美丽,开心,舒服的环境。
可是人类的科技越来越发达,渐渐的就把我们遗忘了。他们的工厂天天冒出黑烟,搞得满天乌云,让我们不见天日!化工厂,天天散发...
浅层的思考,重复多遍,也不可能有任何进益,同一个层次的东西,练习得再多,输出的始终只能是同样的结果,无变化、无修正。 而且,在同一个面上,聚集同类的、相似度很高的知识、练习等,不会产生更多的积极反应,同类的东西,互相复制,无法参考和比较,不能生发意外或者随机,铺的面再广,也...
2.2214:01pm 刚刚看完《心迷宫》,想写下来: 肖宗耀是村长的儿子,与村里的黄欢偷着在一起。 黄欢骗肖宗耀自己怀孕了以威胁他娶自己。 黄欢与肖宗耀在小树林里的对话被白虎听到了,白虎威胁肖宗耀一万块钱,否则就到处宣扬。 白虎爱赌钱,欠了一屁股债,并且当时还偷了瘸子陈自...

我要回帖

更多关于 英语小游戏 的文章

 

随机推荐