知识大全 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

相关参考

知识大全 多线程在JAVA ME应用程序中的使用

多线程在JAVAME应用程序中的使用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  多线程技术是

知识大全 Java Thread类如何在子类中实现run

JavaThread类如何在子类中实现run  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Ja

知识大全 Java多线程中run和start的区别

Java多线程中run和start的区别  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  区别调用

知识大全 eclipse console 中乱码问题

  在项目上点击properties>Run/Debugsettings>newjavaapplication>Common  勾选Run/Debug并选择ConsoleEncodi

知识大全 多线程从线程继承

    为创建一个线程最简单的方法就是从Thread类继承这个类包含了创建和运行线程所需的一切东西Thread最重要的方法是run()但为了使用run()必须对其进行过载或者覆蓋使其能充分按自己的吩咐

知识大全 高级应用 java多线程设计模式详解之一

  线程的创建和启动    java语言已经内置了多线程支持所有实现Runnable接口的类都可被启动一个新线程新线程会执行该实例的run()方法当run()方法执行完毕后线程就结束了一旦一个线程执行

知识大全 也说MVC设计模式

JavaMe开发:也说MVC设计模式  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!    【问题描

知识大全 如何解决Java ME设备碎片问题

如何解决JavaME设备碎片问题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一次编写随处运行

知识大全 制作多个线程

  现在考虑一下创建多个不同的线程的问题我们不可用前面的例子来做到这一点所以必须倒退回去利用从Thread继承的多个独立类来封装run()但这是一种更常规的方案而且更易理解所以尽管前例揭示了我们经常都

知识大全 利用dbmsbackuprestore恢复数据库

  进行测试之前先将数据库做全备  引用  RMAN>run  >allocatechannelchdevicetypedisk;  >backupdatabaseincludecu