中文原文:
http://hi.baidu.com/seucrcr/item/ebd1b34879a168086cc2f078
在android设备上,dalvik vm通常都被嵌入到android应用框架里执行,也可以直接运行vm,就像你要在你桌面系统运行虚拟机一样。
但是很多Android的
JNI
无法调用。因为Android的很多
JNI
其实是需要手动注册的。要想完美的解决该问题,请在shell控制台直接通过运行app_process程序启动一个JAVA程序。
关于
此的更多内容请参考《
如何在Android中启动JAVA程序
》
在编译完java源码后,转换并整合.class文件到.dex文件然后将它push到设备。这儿是个简单的例子:
%
echo
'class Foo {'
\
>
'public static void main(String[] args) {'
\
>
'System.out.println("Hello, world"); }}'
>
Foo
.
java
%
javac
Foo
.
java
%
dx
--
dex
--
output
=
foo
.
jar
Foo
.
class
%
adb push foo
.
jar
/
sdcard
%
adb shell dalvikvm
-
cp
/
sdcard
/
foo
.
jar
Foo
Hello
,
world
-cp
选项设置了路径。adb shel的初始路径可能并不是你要的,最好指定绝对路径。
dx命令接收了每个class的文件、目录或者jar结构列表,当--output文件名以.jar、.zip或者.apk结尾时,一个叫做classes.dex的文件就被创建并保存。
运行adb shell davlikvm -help可获得更多命令行选项。
1、使用调试器
你可以通过服从jdwp的调试器来调试独立的应用,有两种基本方法。
一种是通过TCP,一种是通过DDMS。(CR:唔,前面看过了)
2、桌面编译
dalvik vm也可以直接在桌面使用,事实上这更复杂,因为你没有建立环境的一些东西,本地库代码被用于支持核心dalvik库。
首先:
. build/envsetup.sh
lunch sim-eng
你可以看到
============================================
TARGET_PRODUCT
=
sim
TARGET_BUILD_VARIANT
=
eng
TARGET_SIMULATOR
=
true
TARGET_BUILD_TYPE
=
debug
TARGET_ARCH
=
x86
HOST_ARCH
=
x86
HOST_OS
=
linux
HOST_BUILD_TYPE
=
release
BUILD_ID
=
============================================
这引导你为桌面vm进行编译,编译是基于glibc的。该模式仅仅为实验用,或许将来会更有用。
你可能看到TARGET_BUILD_TYPE=debug或者 = release或者什么都没有,你只要改变lunch命令的参数就可以。
其次,编译:
make
当完成后,在桌面运行dalvik:
%
dalvikvm
E
/
dalvikvm
(
19521
):
ERROR
:
must specify non
-
'.'
bootclasspath
W
/
dalvikvm
(
19521
):
JNI_CreateJavaVM failed
Dalvik VM init failed
(
check log file
)
为了运行,你必须指定指定引导程序的路径,指定放解压jar文件后dex数据的空间。可以这样做:
#!/bin/sh
# base directory, at top of source tree; replace with absolute path
base=`pwd`
# configure root dir of interesting stuff
root=$base/out/debug/host/linux-x86/product/sim/system
export ANDROID_ROOT=$root
# configure bootclasspath
bootpath=$root/framework
export BOOTCLASSPATH=$bootpath/core.jar:$bootpath/ext.jar:$bootpath/framework.jar:$bootpath/android.policy.jar:$bootpath/services.jar
# this is where we create the dalvik-cache directory; make sure it exists
export ANDROID_DATA=/tmp/dalvik_$USER
mkdir -p $ANDROID_DATA/dalvik-cache
exec dalvikvm $@
准备dx的方式和前面一行:
%
cat
>
Foo
.
java
class
Foo
{
public
static
void
main
(
String
[]
args
)
{
System
.
out
.
println
(
"Hello, world"
);
}
}
(
ctrl
-
D
)
%
javac
Foo
.
java
%
dx
--
dex
--
output
=
foo
.
jar
Foo
.
class
%
./
rund
-
cp foo
.
jar
Foo
Hello
,
world
你可以获得参数的帮助通过以下的命令:
% ./rund -help
这也可以显示vm可用选项参数。模拟“调试”环境有完整的additional assertion,使能检测功能(导致了vm变慢),但是也因此能测试。
上述所有都是基于x86的,其他的架构还要考虑porting工作,如果libffi支持你的系统,工作量会比较小。