我有一个包含核心模块的 Android 应用程序。将运行它的模块编码为标准 CLI Java 很容易。
但是如果我在 Android Eclipse 项目中复制这段代码,生成的字节码是针对 dalvik VM 的,它与 JRE 不兼容。
如何在这种场景下轻松开发...
有可能以某种方式在 android 项目中将代码作为标准 JRE 项目启动吗? 是否可以在单独的标准项目中编写此代码并包含一个 jar 文件或作为 android 项目中的依赖项?
[编辑]
我已经尝试过 Alécio 的解决方案,我已经构建了两个项目:
具有此代码的 JVM 项目:
package jvm;
public class SimpleJvm {
public SimpleJvm() {
System.out.println( "Ciao!") ;
}
public static void main(String[] args) {
SimpleJvm simple = new SimpleJvm() ;
}
}
将它打包成一个运行得到的 jar 文件:
C:\Users\Antonio\Desktop>java -cp simplejvm.jar jvm.SimpleJvm
Ciao!
但使用此代码在 Android 项目中使用它(在 libs 目录中复制的 jar):
package com.simpleandroid ;
import android.os.Bundle ;
import android.app.Activity ;
import android.view.Menu ;
import jvm.SimpleJvm;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState) ;
setContentView( R.layout.activity_main) ;
SimpleJvm simple = new SimpleJvm() ;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate( R.menu.main, menu) ;
return true ;
}
}
给出:
07-05 16:51:33.386: E/dalvikvm(2102): Could not find class 'jvm.SimpleJvm', referenced from method com.simpleandroid.MainActivity.onCreate
...
07-05 16:51:33.686: E/AndroidRuntime(2102): FATAL EXCEPTION: main
07-05 16:51:33.686: E/AndroidRuntime(2102): java.lang.NoClassDefFoundError: jvm.SimpleJvm
07-05 16:51:33.686: E/AndroidRuntime(2102): at com.simpleandroid.MainActivity.onCreate(MainActivity.java:15)
07-05 16:51:33.686: E/AndroidRuntime(2102): at android.app.Activity.performCreate(Activity.java:5104)
07-05 16:51:33.686: E/AndroidRuntime(2102): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
07-05 16:51:33.686: E/AndroidRuntime(2102): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
07-05 16:51:33.686: E/AndroidRuntime(2102): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
07-05 16:51:33.686: E/AndroidRuntime(2102): at android.app.ActivityThread.access$600(ActivityThread.java:141)
07-05 16:51:33.686: E/AndroidRuntime(2102): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
07-05 16:51:33.686: E/AndroidRuntime(2102): at android.os.Handler.dispatchMessage(Handler.java:99)
07-05 16:51:33.686: E/AndroidRuntime(2102): at android.os.Looper.loop(Looper.java:137)
07-05 16:51:33.686: E/AndroidRuntime(2102): at android.app.ActivityThread.main(ActivityThread.java:5039)
07-05 16:51:33.686: E/AndroidRuntime(2102): at java.lang.reflect.Method.invokeNative(Native Method)
07-05 16:51:33.686: E/AndroidRuntime(2102): at java.lang.reflect.Method.invoke(Method.java:511)
07-05 16:51:33.686: E/AndroidRuntime(2102): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-05 16:51:33.686: E/AndroidRuntime(2102): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-05 16:51:33.686: E/AndroidRuntime(2102): at dalvik.system.NativeStart.main(Native Method)
我认为原因是不同的 .class 文件格式...在 eclipse 中有可能以某种方式使用 dalvik vm 编译 jar 和使用 jvm 编译 jar 吗?
最佳答案
好的,所以我认为解决方案是使用 ant 或 maven 或类似工具来构建两个不同的 jar 文件,一个与 jvm 兼容,一个与 dalvik 兼容。
起点可以是: http://code.google.com/p/maven-android-plugin/wiki/GettingStarted
我不知 Prop 体怎么做,但我认为在某种程度上是可能的。
关于java - 将 android java 代码作为标准 java 应用程序运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17381351/