知识大全 JavaME程序 Run Anywhere-- 利用反射机制来动态加载声
Posted 知
篇首语:著论准过秦,作赋拟子虚。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 JavaME程序 Run Anywhere-- 利用反射机制来动态加载声相关的知识,希望对你有一定的参考价值。
JavaME程序 Run Anywhere-- 利用反射机制来动态加载声 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
让JavaME程序 Run Anywhere 利用反射机制来动态加载声音API 欢迎指教 t cn Write once run anywhere 是JAVA的口号 但在J ME平台上做的应用 要想不改动代码就run anywhere 难度是很大的 如果要把一个应用程序做到让大多数的机型都适用 就让JavaME程序 Run Anywhere 利用反射机制来动态加载声音API Write once run anywhere 是JAVA的口号 但在J ME平台上做的应用 要想不改动代码就run anywhere 难度是很大的 如果要把一个应用程序做到让大多数的机型都适用 就要考虑到方方面面 其难度是相当大的 比如给百宝箱做游戏 上线机型大多是MIDP 的机器 感觉移植中最麻烦的还要数声音部分的API 必须根据各个机型来改动 虽然图象还比较容易做成自适应的 但声音部分就一般就只能根据各个机型来改动 下面提供一种解决方案 可以让J ME程序在运行时自动加载该机型支持的声音资源并用该机型的声音API来播放 关键问题 各机型提供的播放音乐的API都有所不同 特别是较老的机型 需要在运行时根据机型自动加载 各机型支持的声音的资源文件也不同 需要在运行时根据机型自动加载 各机型的JVM不同 多多少少有一些比较特别的BUG 解决方案 原则 能用标准API就用标准API 不能用的话 就用各个机型自身的API // Player types static final int STANDARD = ; //For MIDI static final int NOKIA = ; //For ott static final int SAMSUNG = ; //For mmf static final int NEC = ; //For MIDI static final String[] supportedPlayerTypes = jadia Player //STANDARD API nokia mid sound Sound // Nokia samsung util AudioClip //samsung dia AudioClip //nec ; 下面利用反射机制来动态加载 public void determinePlayerType() // use most > less use isSupportSound = true; for (int i = ; i < supportedPlayerTypes length; i ) // try to load a proper sound Player try Class forName(supportedPlayerTypes[i]); //加载当前的Player类型 playerType = i; //保存加载成功的类的类型 return; catch (Exception e) //加载不成功 说明不支持 继续加载下一种 e printStackTrace(); isSupportSound = false; 下面就可以根据在载成功的类型来加载可以播放的声音资源了 public void createPlayer(String name) if (!isSupportSound) return; switch (playerType) case STANDARD: // for MIDI case NEC: createPlayerFactory( / name mid ); break; case NOKIA: //for ott createPlayerFactory( / name ott ); break; case SAMSUNG: // for mmf createPlayerFactory( / name mmf ); break; 对各个机型特有的BUG 是没有什么特别好的办法的 只能各个机型调试 这只能怪厂商了 该方案优点 在移植的时候就不用改动代码 只要在相应的机型JAR包中保留相关的资源就可以了 这样就不用为了各个机型都折腾一遍了 注意 用 System getProperty( microedition platform )来确定机型是不保险的 因为有的机型只是简单地返回J ME platform 遗留问题 NecN 在运行 Class forName( jadia Player );时候会立刻报 应用程序出错 而不是抛出 ClassNotFoundException 异常 这是该机型JVM的特性(BUG) 所以给NecN 的代码中必须注释掉jadia Player的一切信息 这就得改动代码 有违我们的初衷 的确是个遗憾 (估计NEC的机型都素这样的) 这个类还有待扩展 以支持更多机型 并加入震动部分的API 理论上可以包含所有的机型 但实际应用中只要包含需要用到的机型相关API就可以了 测试机型 在 三星E MOTOV NOKIA NecN (注释掉jadia Player相关内容)上均测试通过 下面是源程序 /** * Created on * This class is mainly for the games on various mobile platform * If U have any good ideas about the J ME contact me at t cn * * Version */ import javax microedition lcdui *; import java io *; //********************* STANDARD *********************** import jadia *; //********************* NOKIA *********************** import nokia mid sound *; //********************* SAMSUNG *********************** import samsung util *; // ********************* NEC *********************** import dia *; //********************* SonyEricsson *********************** // the same as J ME standard API /** * @author IntoTheDream */ public class MyPlayer private static MyPlayer mp = null; //Sound types to be enlarged static final int MIDI = ; static final int MMF = ; static final int OTT = ; // Player types static final int STANDARD = ; //For MIDI static final int NOKIA = ; //For ott static final int SAMSUNG = ; //For mmf static final int NEC = ; //For MIDI static final String[] supportedSoundTypes = mid mmf ott ; private static int soundType; static final String[] supportedPlayerTypes = jadia Player //must be dimissed for NECN nokia mid sound Sound samsung util AudioClip dia AudioClip ; private static int playerType; // Note : first play sound to determine whether sound On or Off // Of course you can change it in the game static boolean isSupportSound; static boolean isSoundOn = true; // ********************* STANDARD *********************** Player player; // ********************* NOKIA *********************** Sound nokiaPlayer; // ********************* SAMSUNG *********************** samsung util AudioClip samsungPlayer; // ********************* NEC *********************** dia AudioClip necPlayer; // singleton private MyPlayer() public static MyPlayer getMyPlayer() if (mp == null) mp = new MyPlayer(); mp determinePlayerType(); return mp; // automatically run this first !! public void determinePlayerType() // use most > less use isSupportSound = true; for (int i = ; i < supportedPlayerTypes length; i ) // try to load a proper sound Player try Class forName(supportedPlayerTypes[i]); playerType = i; return; catch (Exception e) e printStackTrace(); isSupportSound = false; public void createPlayer(String name) if (!isSupportSound) return; switch (playerType) case STANDARD: // for MIDI case NEC: createPlayerFactory( / name mid ); break; case NOKIA: //for ott createPlayerFactory( / name ott ); break; case SAMSUNG: // for mmf createPlayerFactory( / name mmf ); break; private void createPlayerFactory(String url) if (isSupportSound && isSoundOn) try InputStream is; switch (playerType) case NEC: necPlayer = Media getAudioClip(url); break; case STANDARD: //must be dimissed for NECN is = this getClass() getResourceAsStream(url); player = Manager createPlayer(is audio/midi ); break; case NOKIA: is = this getClass() getResourceAsStream(url); ByteArrayOutputStream baos = new ByteArrayOutputStream(); for (int b = is read(); b >= ; b = is read()) baos write(b); nokiaPlayer = new nokia mid sound Sound(baos toByteArray() nokia mid sound Sound FORMAT_TONE); break; case SAMSUNG: samsungPlayer = new samsung util AudioClip( samsung util AudioClip TYPE_MMF url); break; catch (Exception e) e printStackTrace(); public void play(int loop) if (isSupportSound && isSoundOn) try switch (playerType) case NEC: if (necPlayer == null) break; necPlayer setLoopCount(loop); necPlayer play(); break; case STANDARD: //must be dimissed for NECN if (player == null) break; player setLoopCount(loop); player start(); break; case NOKIA: if (nokiaPlayer == null) break; nokiaPlayer play(loop); break; case SAMSUNG: if (samsungPlayer == null) break; samsungPlayer play(loop ); // is volume break; catch (Exception e) e printStackTrace(); public void stopSound() if (isSupportSound && isSoundOn) try switch (playerType) case STANDARD: //must be dimissed for NECN if (player == null) break; player deallocate(); player stop(); player close(); player = null; break; case NOKIA: if (nokiaPlayer == null) break; nokiaPlayer stop(); nokiaPlayer = null; break; case SAMSUNG: if (samsungPlayer == null) break; samsungPlayer stop(); samsungPlayer = null; break; case NEC: if (necPlayer == null) break; necPlayer stop(); necPlayer = null; break; System gc(); catch (Exception e) e printStackTrace(); cha138/Article/program/Java/hx/201311/26841相关参考
多线程在JAVAME应用程序中的使用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 多线程技术是
JavaThread类如何在子类中实现run 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Ja
Java多线程中run和start的区别 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 区别调用
在项目上点击properties>Run/Debugsettings>newjavaapplication>Common 勾选Run/Debug并选择ConsoleEncodi
为创建一个线程最简单的方法就是从Thread类继承这个类包含了创建和运行线程所需的一切东西Thread最重要的方法是run()但为了使用run()必须对其进行过载或者覆蓋使其能充分按自己的吩咐
线程的创建和启动 java语言已经内置了多线程支持所有实现Runnable接口的类都可被启动一个新线程新线程会执行该实例的run()方法当run()方法执行完毕后线程就结束了一旦一个线程执行
JavaMe开发:也说MVC设计模式 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 【问题描
如何解决JavaME设备碎片问题 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一次编写随处运行
现在考虑一下创建多个不同的线程的问题我们不可用前面的例子来做到这一点所以必须倒退回去利用从Thread继承的多个独立类来封装run()但这是一种更常规的方案而且更易理解所以尽管前例揭示了我们经常都
进行测试之前先将数据库做全备 引用 RMAN>run >allocatechannelchdevicetypedisk; >backupdatabaseincludecu