`
kingj
  • 浏览: 426338 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

linux下编译avian java虚拟机

 
阅读更多

  avian 是一个小型的Java虚拟机,实现了Java的部分基本功能。具体API可以看 这里 。不过这个虚拟机只提供源代码,需要你在linux、MSYS或Cygwin下编译好后才能使用,我在MSYS下尝试了一下,总是报错,最后只好转到Ubuntu下面才成功编译。

    编译过程很简单,只要遵照他的提示就可以了,不过事先肯定是要装好GCC和JDK的(推荐OpenJDK),目标为win32平台时,还需要win32的头文件和库,可以从它的git站点 下载 。 下载后解压到avian目录的上一级目录。
1 $ export JAVA_HOME=/usr/ local /java #JDK位置
2 $ make platform=windows arch=i386

 

     make后面的平台和架构都有其他的选项,比如linux/darwin x86_64等,具体参数可以看 这里 ,编译完成后在build目录下应该有个windows-i386文件夹,里面就是编译好的虚拟机和示例程序。    

    使用avian的好处就在于它很小,可以直接转为本地程序,下面就是在ubuntu的mingw和avian环境下,编译JAVA程序并且将其转化为可以在Window上运行的普通程序

avian 小型JAVA虚拟机(window-i386版本)
mingw 交叉编译环境

步骤1

    建立项目目录${project},复制必要文件。

1 mkdir ${project}
2 cd ${project}
3 ar x ../windows-i386/libavian.a
4 cp ../windows-i386/classpath.jar boot.jar

 

步骤2

     这一步在eclipse里面完成比较方便,编写JAVA源文件${源代码},直接把JRE替换为avian,再加入其他包如SWT等,统一用eclipse编译,直接导出为JAR包,导出时将其他JAR也解开。
步骤3
    把上面生成的 JAR  转为目标文件。

1 ../windows-i386/binaryToObject boot.jar boot-jar.o _binary_boot_jar_start _binary_boot_jar_end windows i386

步骤4

     建立main.cpp文件
01 /*
02 * 调用Java类方法的模块
03 */
04
05 #include "stdint.h"
06 #include "jni.h"
07
08 #if (defined __MINGW32__) || (defined _MSC_VER)
09 #  define EXPORT __declspec(dllexport)
10 #else
11 #  define EXPORT __attribute__ ((visibility("default")))
12 #endif
13
14 #if (! defined __x86_64__) && ((defined __MINGW32__) || (defined _MSC_VER))
15 #  define SYMBOL(x) binary_boot_jar_##x
16 #else
17 #  define SYMBOL(x) _binary_boot_jar_##x
18 #endif
19
20 extern "C" {
21
22    extern const uint8_t SYMBOL(start)[];
23    extern const uint8_t SYMBOL(end)[];
24
25    EXPORT const uint8_t*
26    bootJar(unsigned* size)
27    {
28      *size = SYMBOL(end) - SYMBOL(start);
29      return SYMBOL(start);
30    }
31
32 } // extern "C"
33
34 int
35 main( int ac, const char ** av)
36 {
37    JavaVMInitArgs vmArgs;
38    vmArgs.version = JNI_VERSION_1_2;
39    vmArgs.nOptions = 1;
40    vmArgs.ignoreUnrecognized = JNI_TRUE;
41
42    JavaVMOption options[vmArgs.nOptions];
43    vmArgs.options = options;
44
45    options[0].optionString = const_cast < char *>( "-Xbootclasspath:[bootJar]" );
46
47    JavaVM* vm;
48    void * env;
49    JNI_CreateJavaVM(&vm, &env, &vmArgs);
50    JNIEnv* e = static_cast <JNIEnv*>(env);
51
52    jclass c = e->FindClass( "Hello" ); //在这个地方替换包含main方法的类   if (not e->ExceptionCheck()) {
53      jmethodID m = e->GetStaticMethodID(c, "main" , "([Ljava/lang/String;)V" );
54      if (not e->ExceptionCheck()) {
55        jclass stringClass = e->FindClass( "java/lang/String" );
56        if (not e->ExceptionCheck()) {
57          jobjectArray a = e->NewObjectArray(ac-1, stringClass, 0);
58          if (not e->ExceptionCheck()) {
59            for ( int i = 1; i < ac; ++i) {
60              e->SetObjectArrayElement(a, i-1, e->NewStringUTF(av[i]));
61            }
62             
63            e->CallStaticVoidMethod(c, m, a);
64          }
65        }
66      }
67    }
68
69    int exitCode = 0;
70    if (e->ExceptionCheck()) {
71      exitCode = -1;
72      e->ExceptionDescribe();
73    }
74
75    vm->DestroyJavaVM();
76
77    return exitCode;
78 }

 


步骤5

    编译和链接,下面的程序名称如msvc++都是我取的别名,因为原名称实在太长了,应该是i586-mingw32msvc-c++,不同的mingw版本可能会有所不同,${project}就是你工程的名称。
1 export JAVA_HOME=/usr/lib/jvm/java-6-openjdk
2 msvc++ -I$JAVA_HOME/include -I$JAVA_HOME/include/win32 -D_JNI_IMPLEMENTATION_ -c main.cpp -o main.o
3 msdlltool -z ${project}.def *.o
4 msdlltool -d ${project}.def -e ${project}.exp
5 msvc++ ${project}.exp *.o -L../win32/lib -lmingwthrd -lm -lz -lws2_32 -mwindows -mconsole -o ${project}.exe      #去掉-mconsole后不会出现Console,直接显示GUI。
6 msstrip --strip-all ${project}.exe

 


最后 把{project}.exe复制回Windows即可,在只加入SWT的情况下,程序的大小是2M多

分享到:
评论

相关推荐

    windows下编译avian java虚拟机

    在Windows环境下编译Avian Java虚拟机是一项技术性较强的任务,涉及到多个步骤和知识点。首先,让我们了解一下Avian。Avian是一个轻量级、开源的Java虚拟机,它旨在提供一个快速、小巧且易于集成到其他项目的解决...

    小型Java虚拟机Avian.zip

    Avian 是一个轻量级的 Java 虚拟机和类库,提供了 Java 特性的一个有用的子集,适合开发跨平台、自包容的应用程序。 Avian 实现非常快速而且体积小,主要特性: Just-In-Time (JIT) 编译,快速方法执行 ...

    Cocos2d-Java跨平台游戏引擎

    而能移植到iOS,因为iOS本身没有Java虚拟机,我们自己修改了一个开源项目Avian(Java虚拟机),该虚拟机打包在用户开发的iOS游戏里面。 知识点七:CDK(Cocos2d-Java Develop Kit)开发包 CDK是Cocos2d-Java开发...

    禽类:[INACTIVE]禽类是一种轻量级的虚拟机和类库,旨在提供Java功能的有用子集,适用于构建独立的应用程序

    Avian-轻量级Java虚拟机(JVM) 请注意:该项目目前尚未开发,维护或支持。 随时使用和/或派生它,但是此处提交的任何问题都将被忽略。 快速开始 这些是在x86_64体系结构的各种操作系统上构建Avian的示例。 您可能...

    Joomla Avian模板

    Joomla Avian模板是一款专为Joomla CMS设计的高级网页模板,它提供了丰富的设计元素和功能,以帮助用户创建出专业且吸引人的网站。这款模板以其优雅、响应式的设计和易用性而闻名,适用于各种类型的网站,包括企业、...

    免费开源!!Java 和本机 C++ 之间缺失的桥梁

    JavaCPP 提供了对 Java 内部本机 C++ 的高效访问,这与某些 C/C++ 编译器与汇编语言交互的方式没有什么不同。...在底层,它使用 JNI,因此除了Android、Avian和RoboVM(指令)之外,它还适用于 Java SE 的所有实现。

    Java 和原生 C++ 之间缺失的桥梁.zip

    在底层,它使用 JNI,因此它适用于 Java SE 的所有实现,以及Android、Avian和RoboVM(指令)。更具体地说,与上述或其他地方的方法(CableSwig、JNIGeneratorApp、cxxwrap、JNIWrapper、Platform Invoke、GlueGen、...

    Avian influenza and Newcastle disease

    在介绍《禽流感和新城疫》这本书籍之前,我们先来了解一下禽流感和新城疫这两个疾病的基本概念和它们在动物健康领域的重要性。 禽流感是由A型流感病毒引起的一种禽类传染病,它具有广泛的宿主范围,包括家禽、野生...

    无人机(AVIAN)低空摄影测量作业流程.docx

    - 工作人员必须了解与AvianP系列无人机相关的风险,并在紧急情况下采取适当措施。例如,当电池电压低于特定阈值时,无人机的飞行性能会受到影响,应立即执行降落模式。 - 当上链通信失效,无人机可能会失去导航...

    Avian Influenza A (H5N1) Infection in Humans

    Avian Influenza A (H5N1) Infection in Humans是一份整理发布的食品资料文档,只为你能够轻...该文档为Avian Influenza A (H5N1) Infection in Humans,是一份很不错的参考资料,具有较高参考价值,感兴趣的...

    Jaklin-Avian:(废弃)Jaklin repo https 的子模块

    Jaklin-Avian可能包含了用于构建安全网络通信的Java代码,尤其是涉及到HTTPS协议的部分,这是一种用于在互联网上安全传输数据的协议。 HTTPS(超文本传输安全协议)是HTTP的安全版本,它通过SSL/TLS协议提供了数据...

    Avian Freeware Suite-开源

    Avian Freeware Suite(AFS)提供了两件事:开发人员具有Java Swing小部件,XML处理,Fortran95和Pascal的库; 最终用户(医学生,医生,科学家)使用可以使用的生产力工具(测验,XML数据库和PDF)

    avian-pack.android.external.okhttp:适用于 avian-pack 的 Android okhttp repo 克隆

    OkHttp 适用于 Android ... 与 Java 6 的运行时兼容性作为构建的一部分强制执行,以确保符合 Android 和旧版本的 JVM。测试在桌面上使用 Maven 在桌面上运行 OkHttp 测试。 在桌面上运行 SPDY 测试使用需要 OpenJDK 7+

    avian-range-shifts

    通过分析鸟类的气候生态位广度,可以预测在气候变化背景下,哪些物种的生存风险较高,哪些可能更容易适应新环境。 在R语言中,可以使用各种生态学和统计包来处理和分析数据。例如,`dismo`包可以用来估计物种分布...

    wince下音乐播放器

    至于压缩包内的"Avian Play v5.00 绿色汉化版",这表明我们拥有的是Avian Play的第5.00版本,它已经被汉化为中文,方便中国用户使用。绿色版通常意味着这是一个无需安装、便携式的版本,用户可以直接运行而不必担心...

    New model for the avian magnetic compass

    New model for the avian magnetic compass Bioelectromagnetics 21:555^565 (2000) NewModel for the Avian Magnetic Compass A.R. Liboff1* and K.A. Jenrow2 1Department of Physics, OaklandUniversity, ...

    Pathological lesion and the antigenic localization of highly pathogenic avian influenza virus in Sheldrake Ducks

    高致病性禽流感病毒感染鸭的致死性病理学变化研究,刘晓静,郑世民,为探究国内高致病性禽流感病毒感染家养水禽致病机制,本实验选取对家鸭具有高致病性的早期毒株A/GS/LN/45/04,并对其感染鸭病理学变�

Global site tag (gtag.js) - Google Analytics