私の理解では、Google は、Java ME で JRE を使用するための Oracle のライセンス ポリシーを気に入らなかったため、JRE を模倣する独自の JVM 仕様を使用して書き直しただけですが、特に物事をより効率的かつ効率的にすることに関しては、動作が少し異なります。より安全に。
したがって、私の理解が正しければ、javac
Javaソースコードで実行され、「バイナリ」バイトコードにコンパイルされると、準拠したJVMはDalvikとは異なるバイトコードを解釈することを意味します(場合によっては)。これは、Dalvik と他の (準拠した) JVM との間の固有の違いです。
これまでの私の発言が間違っている場合は、まず訂正してください。
さて、Android に独自のコンパイラが付属しており (そうかもしれません)、Java ソースを とは異なる (Dalvik 準拠の) 方法でjavac
コンパイルした場合、一部のコード (Android SDK でコンパイルされていない) がどのように動作しないかを理解できました。 Android デバイス:
MySource.java --> javac --> MySource.class (JRE-compliant) --> JVM --> running Java app
MySource.java --> android-compiler --> MySource.class (Dalvik-compliant) --> Dalvik JVM --> running Android app
しかし、あなたはjavac
Android アプリのコンパイルに使用しているようです!?!? したがって、次のようになります。
MySource.java --> javac --> MySource.class (JRE-compliant) --> JVM --> running Java app
MySource.java --> javac --> MySource.class (JRE-compliant) --> Dalvik JVM --> running Android app (???)
すべてのソースをバイトコードにコンパイルするために使用される場合javac
、Dalvik が一部の種類の Java コードを実行できないのはなぜですか?
私は昨日非常によく似た質問をしましたが、技術的には回答されましたが (私の質問を読み直した後、私は単に十分に具体的ではなかったことがわかりました)、Java コードを実行できなくする Dalvik に固有のものは何かを誰も説明できませんでした。 Google Guice や Apache Camel などのプロジェクトから。Camel を Dalvik で実行するには、Camel のソースを入手してから、「Android SDK でビルド」する必要があると言われましたが、それが何を意味するのか、何を意味するのかを明確にすることはできませんでした。 .
たとえば、Camel を使用すると、次のようになります (簡略化)。
RouteBuilder.java --> javac --> RouteBuilder.class --> jartool --> camel-context-2.9.jar --> JVM --> running Camel ESB
RouteBuilder.java --> javac --> RouteBuilder.class --> jartool --> camel-context-2.9.jar --> Dalvik JVM --> doesn't work !!! (???)
明らかに、Dalvik JVM 内で、特定の種類の Java コードの実行を妨げる何かが発生しています。 Dalvik JVM に「供給」されたときに実行されない Java コードの種類を理解しようとしています。
編集:前に「しかしCamel 3.0はAndroidで実行されます!」私は知っています-私の質問ではありません!