在树莓派里编译MIDP2.0

编译技术 专栏收录该内容
2 篇文章 0 订阅

昨天把CLDC1.1编译成功了,今天想着编译MIDP,幸好没有像CLDC编译那样痛苦。因为编译MIDP依赖了CLDC,所以CLDC编译成功后就MIDP的编译就会变的相对简单点,但是还是有些麻烦。


【前期准备】:

1、midp-2_0-src-linux-i686.zip,MIDP2.0的源码;注意:用linux编译下载linux版的包,windows编译下载windows版的包。

2、编译CLDC1.1的前期准备和方式

3、安装Xpm、X11、Xwindow相关的开发库:libX11-dev、libXpm-dev、xlibs-dev,解决编译过程中一些命令找不到的问题。

sudo apt-get install libx11-dev
sudo apt-get install libxpm-dev
sudo apt-get install libxt-dev


【正文】

将midp和cldc解压放到同一个文件夹下,我把它们放到“/home/pi/Desktop/java/”文件夹下,cldc的文件夹名称“j2me_cldc”,midp的文件夹名称“midp2.0fcs”,注意:我之后的所有操作,都使用这些文件目录。

首先将一些编译参数设定好,

1)在“midp2.0fcs/build/linux/kvm”目录下,编辑Platform.gmk,将“KVM_DIR = $(MIDP_DIR)/../KVM”改为“KVM_DIR = $(MIDP_DIR)/../j2me_cldc_linux”。

2)在“midp2.0fcs/build/share/makefiles/kvm”目录下,编辑VM.gmk,在首部添加“JAVAC = javac -source 1.4”,然后再添加“vpath %.c $(KVM_DIR)/kvm/VmExtra/src/fp”。编辑Defs.gmk:
KVM_DEF_SRC += cache.c class.c fields.c frame.c garbage.c global.c /
           interpret.c loader.c native.c pool.c thread.c  /
           nativeCore.c loaderFile.c runtime_md.c events.c /
           hashtable.c profiling.c StartJVM.c /
           verifier.c verifierUtil.c log.c stackmap.c execute.c /
           inflate.c jar.c kni.c
改为
KVM_DEF_SRC += cache.c class.c fields.c frame.c garbage.c global.c /
           interpret.c loader.c native.c pool.c thread.c  /
           nativeCore.c loaderFile.c runtime_md.c events.c /
           hashtable.c profiling.c StartJVM.c /
           verifier.c verifierUtil.c log.c stackmap.c execute.c /
           inflate.c jar.c kni.c /
           e_rem_pio2.c e_sqrt.c fp_bytecodes.c k_cos.c k_rem_pio2.c k_sin.c k_tan.c /
           s_ceil.c s_copysign.c s_cos.c s_fabs.c s_floor.c s_scalbn.c s_sin.c s_tan.c /
           w_sqrt.c resource.c fp_math.c

3)在“midp2.0fcs/build/share/makefiles”目录下,编辑Defs.gmk,将“SSL_SRC_FILES = nativecrypto.c MD5.c SHA.c bnlib.c MD2.c messagedigest.c”这行删掉或注释掉,在下面添加“SSL_SRC_FILES = dummy_ssl.c”。然后再编辑MIDP.gmk,添加“BOOTDIR = /usr/lib/jvm/jdk-7-oracle-arm-vfp-hflt”,这个参数就是JDK的目录,我用的是JDK7,所以就写这个。

接下来开始编译。首先会遇到的错误就是关于GeneralBase.ioWait方法报错的,因为上篇文章中,我们已经将次方法去掉了,因此需要用com.sun.cldc.io.Waiter的waitforio()。按照编译错误,将报错文件一个个修改好。

改完后编译,接下来会出现不识别global.h里的“jmp_buf”问题,在midp2.0fcs/src/solaris/native/machine_md.h里 添加 #include <setjmp.h> ”。

再接下来会有一系列的报错,按照如下修改:

修改“j2me_cldc/kvm/VmCommon/src/events.c”,添加一个宏定义

#define SLEEP_FOR(wakeupTime)                                                           \
    {  long delta = wakeupTime - CurrentTime_md();                               \
           struct timeval timeout;                                                                    \
           timeout.tv_sec = delta / 1000;                                                        \
           timeout.tv_usec = (delta % 1000) * 1000;                                     \
           select(0, NULL, NULL, NULL, &timeout);                                     \
        }

将文件“midp2.0fcs/src/share/native/kvm/midpServices.c”的宏    ERROR_THROW 改成 THROW

修改“midp2.0fcs/src/share/native/kvm/midpEvents.c”:

 void Java_com_sun_midp_lcdui_Events_open(void) {
-    Java_com_sun_cldc_io_j2me_events_PrivateInputStream_open();
+    
 }
 
 void Java_com_sun_midp_lcdui_Events_readInt(void) {
-    Java_com_sun_cldc_io_j2me_events_PrivateInputStream_readInt();
+    JVM_EventsReadInt();
 }
 
 void Java_com_sun_midp_lcdui_Events_readUTF(void) {
-    Java_com_sun_cldc_io_j2me_events_PrivateInputStream_readUTF();
+    JVM_EventsReadUTF();
 }

最后,在“/home/pi/Desktop/java_tool_source/midp2.0fcs/build/linux/kvm”目标下,添加一个文件为“dummy_ssl.c”的c文件,内容为:

void Java_com_sun_midp_ssl_Alg2_modExp(void) {}
void Java_com_sun_midp_ssl_Alg3_nativetx(void) {}
void Java_com_sun_midp_ssl_MD5_nativeUpdate(void) {}
void Java_com_sun_midp_ssl_MD5_nativeFinal(void) {}
void Java_com_sun_midp_ssl_MD2_nativeUpdate(void) {}
void Java_com_sun_midp_ssl_MD2_nativeFinal(void) {}
void Java_com_sun_midp_ssl_SHA_nativeUpdate(void) {}

void Java_com_sun_midp_ssl_SHA_nativeFinal(void) {}


到此,应该修改的都差不多了,make clean后,再make,完成!!!

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值