下面使用一个程序来说明如何在PC上和Android系统上编译我们写好的java程序
PC端:
在PC上执行java程序时我们一般使用javac来编译程序,以一个Hello.java程序来说明一下编译的步奏:
- javac Hello.java
- 编译之后会得到一个Hello.class
- 执行:java Hello
Android端:
在android里面他的虚拟机就不是java了,而是一个称为”dalvikvm”的虚拟机,它接收的是一个dex格式的文件,所以我们需要将class文件转换为dex格式的文件,在PC端下使用如下指令(dx -h)进行转换:
dx --dex --output=Hello.jar Hello.class
可能出现找不到dx命令的情况,需要先设置一下android的环境,这个dx命令是android自带的,直接在android源码目录下输入如下(根据自己的系统设置环境):
source build/envsetup.sh
lunch aosp_nanopi3-userdebug
执行成功后把jar文件复制到网络文件系统上:
cp Hello.jar /work/nfs_root/android_fs
Android系统如何mount网络文件系统呢?
在android命令行下执行以下命令挂接网络文件系统:
su
ifconfig eth0 192.168.1.180
busybox mount -t nfs -o nolock,vers=2 192.168.1.170:/work/nfs_root /mnt
可能出现找不到busybox的问题,需要先在单板上安装busybox,busybox的安装比较简单:
在这个网址先下载一个busybox:http://www.busybox.net/downloads/binaries/1.21.1/
我下载的是:busybox-armv7l(下载下来后修改名字为busybox)
安装busybox:
这里我是将下载下来的busybox放到SD,然后把SD放插到单板上后放到system/bin目录下
放到system目录下时,有可能出现这个报错”Read-only file system”
解决方法是执行:mount -o rw,remount /system
成功放到system/bin目录下后,进入bin目录执行:
chmod 755 busybox
busybox –install /system/bin
以后就可以使用busybox的指令了,在上面的 busybox mount 指令成功后进入网络文件的目录:
cd /mnt/android_fs
在这个目录下执行如下命令:
dalvikvm -cp /mnt/android_fs/Hello.jar Hello
最后一个参数 Hello 是要执行的类名,至此整个编译过程就完成了
这里还介绍另一个常用的方法,使用系统自带的“ app_process“ 这个应用程序,它的使用格式如下:
CLASSPATH=... app_process [java-options] cmd-dir start-class-name [options]
这里直接用 Hello.java 程序来作为一个示例:
CLASSPATH=/mnt/android_fs/Hello.jar app_process . Hello
去哪里找Hello这个类,填写Hello.jar的路径 父目录 要执行的类名
父目录作用:后面如果要读取的话是基于哪个目录去读取那些文件的
由于上面的指令特别多,我们能否借助andorid的编译系统来编译程序呢?
把代码放到android源码中编译:
添加Androd.mk,内容类似: 参考frameworks/base/cmds/am/Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_MODULE := Hello
include $(BUILD_JAVA_LIBRARY)
我是把java代码放在源码目录下的frameworks/testing下,使用mmm命令进行编译生成jar文件,将jar文件通过网络文件传输到andorid上,直接使用 “dalvikvm” 或 “app_process” 编译即可。