上一回合有说到打造自己的j2me和找到了phoneme这个开源项目。
经过这几天地下工作的努力终于是有所结果。(为什么说是地下呢?这可不好在此公开)
在linux下成功编译phoneme feature mr3的arm和x86平台,并可以成功在cldc_vm上运行Hello Java
arm平台在自己的sky2400和公司的marvell, storlink平台都测试通过
不过现在也只是完成了cldc这一层,虽然midp也成功编译,但是从makefile来看也只是omap730平台的
midp层是与自己的平台息息相关的东西,这个才是真正要做移植工作的地方
比如显示是用哪种接口,qt? directfb? 按键等等
下面先说说编译CLDC和MIDP吧,移植MIDP以后有机会再说
1,环境:
机器:x86 pc or vmware
系统: Debian GNU/Linux 4.0 r3 Etch
2,准备:
1) 解包需要命令:unzip,如没有且可以上网可以:apt-get install unzip
2) 如果编译MIDP需要库:libxp6, libxtst6,可以如此安装:apt-get install libxp6 libxtst6
因为编译的是使用fb,这种比较简单依赖的库也最少,如果是qt或者directfb依赖的更多些
3) 如果不编译MIDP可以使用jdk 5,否则一定要jdk 1.4。
(本想直接使用jdk 5来处理的,可是研究了一小段时间还是不行)
jdk 5和jdk 1.4可以只安装后者,或者两者都安装。
安装jdk 5可以直接:apt-get install sun-java5-jdk
jdk 1.4就没这么好办了,得到网上下载来安装,可参考如下步骤:
wget http://mirrors.dotsrc.org/java-linux/JDK-1.4.2/i386/03/j2sdk-1.4.2-03-linux-i586.bin ##下载安装包
chmod +x j2sdk-1.4.2-03-linux-i586.bin ##加上可执行权限
./j2sdk-1.4.2-03-linux-i586.bin ##进行安装
mv j2sdk1.4.2 /opt ##移动/opt目录下
4) 下载phoneme feature mr3
wget http://download.java.net/mobileembedded/phoneme/feature/phoneme_feature-mr3-rel-src-b01-17_jul_2008.zip
3,编译脚本(又是脚本,懒人的好东西啊)
################## build-phoneme.sh file start ####################
#!/bin/sh
JAVACALL_PACKAGE=phoneme_feature-mr3-rel-src-b01-17_jul_2008.zip
### 这里视你安装的jdk版本和路径
export JDK_DIR=/opt/j2sdk1.4.2
#export JDK_DIR=/usr/lib/jvm/java-1.5.0-sun
### 记得这里要改的啊
export COMPONENTS_DIR=/home/fi9/j2me/phoneme_feature
if [ $1 = 'arm' ]; then
### arm
export CPU=arm
export TARGET_CPU=linux_arm
export JAVACALL_PLATFORM=linux_arm_gcc
export PCSL_PLATFORM=linux_arm_gcc
### 这里改为你的gcc前缀
export GNU_TOOLS_PREFIX=arm-linux-
### 这里改为你的arm gcc存放的地方
export GNU_TOOLS_DIR=/opt/EmbedSky/crosstools_3.4.1_softfloat/arm-linux/gcc-3.4.1-glibc-2.3.3
elif [ $1 = 'mips' ]; then
### mips !!!注,MIPS平台的还没编译通过, 因为PCSL和MDIP还没移植好,只是CLDC已有相关脚本
export CPU=mips
export TARGET_CPU=linux_mips
export JAVACALL_PLATFORM=linux_mips_gcc
export PCSL_PLATFORM=linux_mips_gcc
### 这里改为你的gcc前缀
export GNU_TOOLS_PREFIX=mips_lexra_fp_be-
### 这里改为你的gcc存放的地方
export GNU_TOOLS_DIR=/opt/hardhat/devkit/mips/lexra_fp_be
else
### x86
export TARGET_CPU=linux_i386
export JAVACALL_PLATFORM=linux_i386_gcc
export PCSL_PLATFORM=linux_i386_gcc
export GNU_TOOLS_DIR=/usr
fi
export AS=${GNU_TOOLS_PREFIX}as
export CC=${GNU_TOOLS_PREFIX}gcc
export CPP=${GNU_TOOLS_PREFIX}g++
export LD=${GNU_TOOLS_PREFIX}gcc
export AR=${GNU_TOOLS_PREFIX}ar
export ENABLE_PCSL=true
export ENABLE_ISOLATES=true
export COMPONENTS_DIR=`pwd`/phoneme_feature
export BUILD_OUTPUT_DIR=$COMPONENTS_DIR/build_output
export MIDP_OUTPUT_DIR=$COMPONENTS_DIR/midp
export PCSL_OUTPUT_DIR=$COMPONENTS_DIR/pcsl
export CLDC_OUTPUT_DIR=$COMPONENTS_DIR/cldc
export CLDC_DIST_DIR=$CLDC_OUTPUT_DIR/$TARGET_CPU/dist
export JVMWorkSpace=$COMPONENTS_DIR/cldc
export JVMBuildSpace=$COMPONENTS_DIR/cldc
export JAVACALL_DIR=$COMPONENTS_DIR/javacall
export PROJECT_JAVACALL_DIR=$COMPONENTS_DIR/javacall-com
export JAVACALL_OUTPUT_DIR=$COMPONENTS_DIR/javacall
export TOOLS_DIR=$COMPONENTS_DIR/tools
export TOOLS_OUTPUT_DIR=$COMPONENTS_DIR/tools
#####################################################################
## 修改phoneme_feature/midp/build/linux_fb_gcc/Options.gmk中相应的选项为true
##### JSRs
##### 详细可查看:http://jcp.org/en/jsr/detail?id=ID号
# (Extra) JSR75 Subsystem
# Description: PDA Optional Packages for the J2METM Platform
export JSR_75_DIR=$COMPONENTS_DIR/jsr75
export PROJECT_JSR_75_DIR=
# (Extra) Bluetooth Subsystem
# Description: JavaTM APIs for Bluetooth
export JSR_82_DIR=$COMPONENTS_DIR/jsr82
export PROJECT_JSR_82_DIR=
# (Extra) WMA 1.1 Subsystem
# Description: Wireless Messaging API
export JSR_120_DIR=$COMPONENTS_DIR/jsr120
export PROJECT_JSR_120_DIR=
# Multimedia Subsystem
# Description: Mobile Media API
export JSR_135_DIR=$COMPONENTS_DIR/jsr135
# (Extra) Web Services Subsystem
# Description: J2METM Web Services Specification
export JSR_172_DIR=$COMPONENTS_DIR/jsr172
export PROJECT_JSR_172_DIR=
# (Extra) SATSA Subsystem
# Description: Security and Trust Services API for J2METM
export JSR_177_DIR=$COMPONENTS_DIR/jsr177
export PROJECT_JSR_177_DIR=
# (Extra) Location Subsystem
# Description: Location API for J2METM
export JSR_179_DIR=$COMPONENTS_DIR/jsr179
export PROJECT_JSR_179_DIR=
# (Extra) SIP Subsystem
# Description: SIP API for J2METM
export JSR_180_DIR=$COMPONENTS_DIR/jsr180
# (Extra) M3G Subsystem
# Description: Mobile 3D Graphics API for J2METM
export JSR_184_DIR=$COMPONENTS_DIR/jsr184
# (Extra) WMA 2.0 Subsystem
# Description: Wireless Messaging API 2.0
export JSR_205_DIR=$COMPONENTS_DIR/jsr205
export PROJECT_JSR_205_DIR=
# (Extra) CHAPI Subsystem
# Description: Content Handler API
export JSR_211_DIR=$COMPONENTS_DIR/jsr211
export PROJECT_JSR_211_DIR=
# (Extra) Scalable Vector Graphics Subsystem
# Description: Scalable 2D Vector Graphics API for J2METM
export JSR_226_DIR=$COMPONENTS_DIR/jsr226
export PISCES_DIR=$COMPONENTS_DIR/pisces
# (Extra) Payment Subsystem
# Description: Payment API
export JSR_229_DIR=$COMPONENTS_DIR/jsr229
export PROJECT_JSR_229_DIR=
# (Extra) DataSync Subsystem
# Description: Data Sync API
export JSR_230_DIR=$COMPONENTS_DIR/jsr230
# (Extra) Advanced Multimedia Subsystem
# Description: Advanced Multimedia Supplements
export JSR_234_DIR=$COMPONENTS_DIR/jsr234
# (Extra) Mobile I18N Subsystem
# Description: Mobile Internationalization API
export JSR_238_DIR=$COMPONENTS_DIR/jsr238
export PROJECT_JSR_238_DIR=
# (Extra) OpenGL ES Subsystem
# Description: JavaTM Binding for the OpenGL ES API
export JSR_239_DIR=$COMPONENTS_DIR/jsr239
export PROJECT_JSR_239_DIR=
# (Extra) Mobile Sensor
# Description: Mobile Sensor API
export JSR_256_DIR=$COMPONENTS_DIR/jsr256
export PROJECT_JSR_256_DIR=
# (Extra) XML api for Java ME
# Description: JSR XML API for JavaTM ME
export JSR_280_DIR=$COMPONENTS_DIR/jsr280
export PROJECT_JSR_280_DIR=
# (Extra) Abstractions Subsystem
# Description: Abstractions for optional packages
export ABSTRACTIONS_DIR=$COMPONENTS_DIR/abstractions
##### DIRECTFB
export DIRECTFB_INSTALL_DIR=$COMPONENTS_DIR/../system/tmp
##### SSL
# Restricted Security
export USE_RESTRICTED_CRYPTO=true
export RESTRICTED_CRYPTO_DIR=$COMPONENTS_DIR/restricted_crypto
##### JPEG decoding for putpixel
# (Extra) JPEG lib
# Description: JPEG
export JPEG_DIR=$COMPONENTS_DIR/jpeg
#####################################################################
### 解包
if [ ! -d $COMPONENTS_DIR ]; then
unzip -q $JAVACALL_PACKAGE
### patch
sed -i -e "s/\/bin\/javac/\/bin\/javac -source 1\.4 -target 1\.4/" phoneme_feature/tools/makefiles/common_defs.gmk
sed -i -e "s/\/bin\/javac\$(EXE)/\/bin\/javac\$(EXE) -source 1\.4 -target 1\.4/" phoneme_feature/pcsl/tools/sosProxy/GNUmakefile
sed -i -e "s/\$(GNU_TOOLS_BINDIR)ar/\$(GNU_TOOLS_BINDIR)${GNU_TOOLS_PREFIX}ar/" phoneme_feature/pcsl/makefiles/share/gcc.gmk
sed -i -e "s/\$(GNU_TOOLS_BINDIR)gcc/\$(GNU_TOOLS_BINDIR)${GNU_TOOLS_PREFIX}gcc/" phoneme_feature/pcsl/makefiles/share/gcc.gmk
sed -i -e "s/\$(GNU_TOOLS_BINDIR)g++/\$(GNU_TOOLS_BINDIR)${GNU_TOOLS_PREFIX}g++/" phoneme_feature/pcsl/makefiles/share/gcc.gmk
sed -i -e "s/NETWORK_MODULE = bsd\/qte/NETWORK_MODULE = bsd\/generic/" phoneme_feature/pcsl/makefiles/top.gmk
sed -i -e "s/\$(GCC_PREFIX)ar/\$(GCC_PREFIX)${GNU_TOOLS_PREFIX}ar/" phoneme_feature/cldc/build/share/jvm.make
sed -i -e "s/\$(GCC_PREFIX)as/\$(GCC_PREFIX)${GNU_TOOLS_PREFIX}as/" phoneme_feature/cldc/build/share/jvm.make
sed -i -e "s/\$(GCC_PREFIX)gcc/\$(GCC_PREFIX)${GNU_TOOLS_PREFIX}gcc/" phoneme_feature/cldc/build/share/jvm.make
sed -i -e "s/\$(GCC_PREFIX)g++/\$(GCC_PREFIX)${GNU_TOOLS_PREFIX}g++/" phoneme_feature/cldc/build/share/jvm.make
sed -i -e "/gcc_arch = \$(host_arch)/iFORCE_GCC=g++" phoneme_feature/cldc/build/share/jvm.make
sed -i -e "s/\/bin\/javac/\/bin\/javac -source 1\.4 -target 1\.4/" phoneme_feature/cldc/build/share/tools.make
#sed -i -e "s/\/bin\/javac\$(EXE)/\/bin\/javac\$(EXE) -source 1\.4 -target 1\.4/" phoneme_feature/midp/build/common/makefiles/Defs.gmk
sed -i -e "s/\/bin\/javac/\/bin\/javac -source 1\.4 -target 1\.4/" phoneme_feature/midp/build/common/makefiles/cdc_vm.gmk
sed -i -e "s/\/bin\/javac\$(JVM_EXE_SUFFIX)/\/bin\/javac\$(JVM_EXE_SUFFIX) -source 1\.4 -target 1\.4/" phoneme_feature/midp/build/share/libdefs.gmk
sed -i -e "s/\$(GNU_TOOLS_BINDIR)ar/\$(GNU_TOOLS_BINDIR)${GNU_TOOLS_PREFIX}ar/" phoneme_feature/midp/build/common/makefiles/gcc.gmk
sed -i -e "s/\$(GNU_TOOLS_BINDIR)gcc/\$(GNU_TOOLS_BINDIR)${GNU_TOOLS_PREFIX}gcc/" phoneme_feature/midp/build/common/makefiles/gcc.gmk
sed -i -e "s/\$(GNU_TOOLS_BINDIR)g++/\$(GNU_TOOLS_BINDIR)${GNU_TOOLS_PREFIX}g++/" phoneme_feature/midp/build/common/makefiles/gcc.gmk
sed -i -e "s/\$(GNU_TOOLS_BINDIR)ranlib/\$(GNU_TOOLS_BINDIR)${GNU_TOOLS_PREFIX}ranlib/" phoneme_feature/midp/build/common/makefiles/gcc.gmk
sed -i -e "s/\$(GNU_TOOLS_BINDIR)as/\$(GNU_TOOLS_BINDIR)${GNU_TOOLS_PREFIX}as/" phoneme_feature/midp/build/common/makefiles/gcc.gmk
fi
### building PCSL
make -C $COMPONENTS_DIR/pcsl
if [ 0 -ne $? ]; then
exit 1
fi
### building CLDC
## 编译OK后在目录 $COMPONENTS_DIR/midp/ 下生成相应的目录和程序、库
make -C $COMPONENTS_DIR/cldc/build/$TARGET_CPU product
if [ 0 -ne $? ]; then
exit 1
fi
### building MIDP
## 在编译MIDP就去掉出面的注释
## 这里暂只使用fb,至于qt或者directfb有兴趣再研究
##
## 编译OK后在目录 $COMPONENTS_DIR/cldc/linux_arm/dist 下生成相应的程序和库
#make -C $COMPONENTS_DIR/midp/build/linux_fb_gcc
################## file end build-phoneme.sh ####################
4,patch和说明
1) javac相关
phoneme需要的是jdk 1.4,因此很多makefile(很多java源码也)写的时候没有考虑到现在都用jdk 5了
也有少许几个makefile考虑到了兼容性的问题编译时使用了如:
javac -source 1.4 -target 1.4
以下是我修改以上这种情况的文件:
a) phoneme_feature/tools/makefiles/common_defs.gmk 修改30行
b) phoneme_feature/pcsl/tools/sosProxy/GNUmakefile 修改35行
c) phoneme_feature/cldc/build/share/tools.make 修改28行
d) phoneme_feature/midp/build/common/makefiles/cdc_vm.gmk 修改178行
e) phoneme_feature/midp/build/share/libdefs.gmk 修改76行
其中,phoneme_feature/midp/build/common/makefiles/Defs.gmk本来是修改168行的
但是修改后倒是总也编译midp不通过,老是报以下的错误,而不修改就OK,暂时不明白为什么
/home/fi9/j2me/phoneme_feature/midp/build/linux_fb_gcc/../../src/ams/ams_base_cldc/reference/classes/com/sun/midp/main/CldcMIDletLoader.java:70: cannot resolve symbol
symbol : method initCause (java.lang.ClassNotFoundException)
location: class java.lang.NoClassDefFoundError
if (!MIDlet.class.isAssignableFrom(midletClass)) {
^
Fatal Error: Unable to locate method initCause
make[1]: *** [/home/fi9/j2me/phoneme_feature/midp/classes.zip] Error 1
make[1]: Leaving directory `/home/fi9/j2me/phoneme_feature/midp/build/linux_fb_gcc'
make: *** [build_classes] Error 2
make: Leaving directory `/home/fi9/j2me/phoneme_feature/midp/build/linux_fb_gcc'
2) gcc相关
phoneme没有考虑到交叉编译时gcc之类是有个前缀的,像:arm-linux-
因此,如果你的编译器是带前缀的必要修改以下文件:
a) phoneme_feature/pcsl/makefiles/share/gcc.gmk 修改46~47行
b) phoneme_feature/cldc/build/share/jvm.make 修改1482~1486行,并在1462行添加一行:FORCE_GCC=g++,如:
ifeq ($(IsTarget), true)
gcc_arch = $(arch)
else
gcc_arch = $(host_arch)
FORCE_GCC=g++
endif
c) phoneme_feature/midp/build/common/makefiles/gcc.gmk 修改以下几行:91, 92, 95, 104, 107, 115
如果出现类似以下的错误就是由于没做着b)这个修改:
... _MergedSrc001.cpp
{standard input}: Assembler messages:
{standard input}:6917: Error: bad instruction `int $03'
{standard input}:7803: Error: bad instruction `int $03'
{standard input}:7848: Error: bad instruction `int $03'
{standard input}:8554: Error: bad instruction `int $03'
{standard input}:8895: Error: bad instruction `int $03'
{standard input}:8996: Error: bad instruction `int $03'
{standard input}:9268: Error: bad instruction `int $03'
make[1]: *** [_MergedSrc001.o] 错误 1
make[1]: Leaving directory `/home/fi9/j2me/phoneme_feature/cldc/linux_arm/loopgen/app'
make: *** [_loopgen] 错误 2
make: Leaving directory `/home/fi9/j2me/phoneme_feature/cldc/build/linux_arm'
3) 其它
这里我只是修改了网络使用通用的BSD API实现而不是用QT库,以减少依赖性
phoneme_feature/pcsl/makefiles/top.gmk 修改82行,bsd/qte改为bsd/generic
5,可能出现的问题
1) 出现类似以下情况的一定是由于gcc的环境变量设置不对,参考上面4.2的gcc相关说明
make[2]: Entering directory `/home/fi9/j2me/phoneme_feature/pcsl/print/stdout'
/bin/sh: /opt/EmbedSky/crosstools_3.4.1_softfloat/arm-linux/gcc-3.4.1-glibc-2.3.3/bin/arm_920t_le-gcc: No such file or directory
make[2]: *** [/home/fi9/j2me/phoneme_feature/build_output/pcsl/linux_arm/obj/pcsl_print.o] Error 127
make[2]: Leaving directory `/home/fi9/j2me/phoneme_feature/pcsl/print/stdout'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/home/fi9/j2me/phoneme_feature/pcsl/print'
make: *** [all] Error 2
make: Leaving directory `/home/fi9/j2me/phoneme_feature/pcsl'
6,测试。
1)测试cldc。
A) copy phoneme_feature/cldc/linux_arm/dist/bin/cldc_vm 到目标主机上
B) 测试代码:
/* filename: test.java */
public class test {
public static void main(String[] args) {
System.out.println("Hello Java ME\n");
}
}
C) 要开发机上编译
javac test.java
D) copy test.class 到目标机上
E) 测试:cldc_vm test
2)测试midp
A) 分别copy phoneme_feature/midp目录下的appdb、bin和lib三目录到目标主机上
B) 运行bin/arm目录下的./autotest
7,移植。
1)屏幕宽高的设置。
修改文件:
phoneme_feature/midp/src/configuration/configuration_xml/linux_fb/constants.xml
相关的HIGHT和WIDTH
2)键盘鼠标等输入和输出。
A)fb对就的文件:phoneme_feature/midp/src/highlevelui/fb_port/fb/native/fb_port.c
修改initFrameBuffer和initKeyboard中设备的名称和初始化过程。
B)directfb:phoneme_feature/midp/src/highlevelui/fb_port/directfb/native/directfb_port.c
暂时还不清楚为什么getKeyboardFd和getMouseFd都是返回-1,
可能就造成directfb下取不到输入,具体看:
phoneme_feature/midp/src/events/mastermode_port/linux_fb/native/mastermode_check_signal.c中的函数checkForSocketPointerAndKeyboardSignal
要知下来的发展,请多多关注留意。
首次玩不太熟,有错望指出,也请牛人多指教。
email 4 me: hackthinking at gmail.com
writed by fi9 in shenzhen 2009-03-04
=================
修正了一些错误并修改了脚本以大家更好使用 2009-03-17
=================
1,添加以下一行,并加上出错的现象:
sed -i -e "/gcc_arch = \$(host_arch)/iFORCE_GCC=g++" phoneme_feature/cldc/build/share/jvm.make
2,修改BUG。把修改ar的向前移,不然会arm-linux-gcc的会再次被匹配上并被修改为:arm-linux-arm-linux-gcc。
modified by fi9 in cn.gd.sz 2009-04-07
==================
久不动,最近把directfb + gtk移植到s3c2440,今晚也成功把midp运行了起来,不过是基于fb,下来把其再移到directfb下,然后再完善完善。
添加以下:
1,添加测试的步骤。
modified by fi9 in cn.gd.sz 2009-06-09
==================
1,添加对扩展支持的设置,如:JSRs,DirectFB,JPEG等
2,添加移植的一些心得。
modified by fi9 in cn.gd.sz 2009-06-10 |