Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何区分处理草图运行的模式(Java/JS/Android)?_Java_Javascript_Android_Processing_Mode - Fatal编程技术网

如何区分处理草图运行的模式(Java/JS/Android)?

如何区分处理草图运行的模式(Java/JS/Android)?,java,javascript,android,processing,mode,Java,Javascript,Android,Processing,Mode,我编写了一个多平台逻辑游戏,它必须在所有模式下工作:Java、JS和Android。我需要在所有模式下做一些不同的事情(特别是但不限于存储,对于Java/Android,我想使用load/saveTable,对于JS-localStorage) 为此,我需要获取信息,即草图运行的模式。我需要在运行时这样做,只是为了避免为所有平台保留不同的源代码 我在看文档,但在主题中什么也没找到。我的谷歌研究也让我想到,甚至没有人要求 我曾考虑使用try/catch检查Java中存在但JS中不存在的一些函数,但

我编写了一个多平台逻辑游戏,它必须在所有模式下工作:Java、JS和Android。我需要在所有模式下做一些不同的事情(特别是但不限于存储,对于Java/Android,我想使用load/saveTable,对于JS-localStorage)

为此,我需要获取信息,即草图运行的模式。我需要在运行时这样做,只是为了避免为所有平台保留不同的源代码

我在看文档,但在主题中什么也没找到。我的谷歌研究也让我想到,甚至没有人要求

我曾考虑使用try/catch检查Java中存在但JS中不存在的一些函数,但这似乎是不合法的,而且我找不到合适的方法

我发现:

try {
  PApplet a;
  a = new PApplet();
  mode = "JAVA";
}
catch(Throwable e) {
  mode = "JS";
}
这区分了Java和JavaScript,但无法识别Android


总而言之,区分我是在JS模式下运行草图还是在运行时在Java模式下运行草图的最佳方法是什么?

好的,我找到了使用try/catch的非常好的方法:

String mode;

mode = "unknown";

try {
  java.lang.Object a;
  a = new java.lang.Object();
  mode = "JAVA";
}
  catch(Throwable e) {
  mode = "JS";
}
这将JavaScript与Java/Android区分开来,但无法将Android与Java区分开来。但是,由于差异是最小的,这不会对我的兼容性造成重大问题


如果有人知道如何做得更好,请张贴你的答案

我想出了如何检测Java与Android模式的区别。有点像黑客:

import java.lang.reflect.*;

Method getInternalProcessingMethod(String methodName) {
    /*
     * Helper method that can be used to return
     * an internal processing method by name
     */
    Class cls = this.getClass();
    
    try {
        return cls.getMethod(methodName);
    } catch (Exception e) {
        return null;
    }
}

boolean isAndroidMode() {
    /*
     * Determine if we're running in Android mode or not
     */
     
    // What?
    // In Android mode 'displayDensity' is a field and in Java
    // mode 'displayDensity' is a method. This is a hack...but
    // it works.
    if (getInternalProcessingMethod("displayDensity") == null) {
        return true;
    }
    return false;
}
然后你可以用它做一些事情,比如我用它做什么:

void settings() {
    IS_ANDROID_MODE = isAndroidMode();
    if (IS_ANDROID_MODE) {
        println("Android mode detected");
        fullScreen();
        SAVE_LOCATION = "blah.json";
    } else {
        println("Java mode detected");
        size(600, 1233);
        SAVE_LOCATION = "data/blah.json";
    }
}

现在,我可以在桌面上的一个小窗口中运行我的测试应用程序,然后在Android上以不同的保存文件路径全屏运行。

Java是编译语言,JavaScript是解释语言。这意味着,尽管您只需按下播放按钮,但在Java模式下,您的源代码将被编译为Java字节码,剩下的是一个已编译的二进制程序,您“无法”进一步更改,在JavaScript中,源代码被转换为JavaScript源代码,剩下的只是文件中转换后的可读源代码。因此,决定是在编译时做出的,您将始终需要处理IDE来重新编译所有内容。谢谢您的评论。我知道,源代码将分别编译为Android应用程序、Java可执行文件和JS。但是我只想写代码,所有平台都有相同的源代码,因此我只需要编译它们,而不需要对每个平台做进一步的更改。我猜你也可以做类似的事情,尝试实例化一个Android特定的类。