1.背景

  昨天在网上看到别人用aauto写本地小程序写的很爽,我觉得如果java的jre能小一点,凭借java庞大的第三方类库写小工具也还算不错的。本人就经常用eclipse+一些commons包写些小工具软件。不过可惜的是只能自己用,对于没装java环境的人来说就麻烦了。所以就去网上找到了一个轻量级java虚拟机avian。但是在编译和安装过程中遇到了很多困难,特此记录。

2.开始编译

  废话少说,先说重点。其实在这个软件的gihub首页以及清晰的讲述了安装教程,无奈这是英文的,而且主要是自己没有过编译开源程序的经验,也没有玩过什么msys,cygwin的linux编译环境。这次也算是当作一次练习,毕竟以前我只要遇到需要自己编译的开源项目就敬而远之。

  其实安装的难点有两个,第一个在http://kingj.iteye.com/blog/1614892这个博客中已经一语道破了。。win32/64文件夹要和avian的解压文件夹并列。。我一直以为要合并着来着,官网也没有特殊说明,本人也没有玩过linux命令行,所以。。不说多了说多了都是泪。。

  第二个就是cygwin的安装。这个的安装注定是要折腾的,虽然网上到处都是教程,但是问题是这些教程有很多细节都没有明说啊,也饶了不少远路。除了一般教程都说的要按照的

binutils、gcc、gcc-mingw、gdb之外,还要安装make,zlib(第一次安装我照着教程装忘记装avian需要的make了,吐血。。)。这都是32位的,如果你要安装64位的则还有make, gcc-mingw-g++, mingw64-i686-gcc-g++, mingw64-x86_64-gcc-g++, mingw64-x86_64-zlib(这几个其实avian官网有介绍,但是没有介绍zlib。。因为是写在中间,所以我也是后来才看到的,这排版真心不科学。。)反正我电脑是64位的,所以我这几个都安装了,避免出现任何问题。。

环境装好了,然后需要的就是照着官网的教程敲命令 了

这里以32位为例。因为在64位下可以编译32位的,但是编译成64位的就不能在32位运行了。

$ git clone https://github.com/ReadyTalk/win32.git ../win32 #官网是下载win64,我们全部改成win32。不过那个官网的git地址有问题,自己去github下载zip复制也行
$ export JAVA_HOME="/cygdrive/c/Program Files/Java/jdk1.7.0_45" #引入JAVA_HOME,相当于windows下cmd的setpath吧
$ make platform=windows arch=i386   #这里需要注意,没有指定编译环境默认就是本机环境,如果电脑是64位的,那么之前你下载的win32头文件会冲突,所以必须指定为i386,如果你是想编译64位的,则之前的git clone就应该是64位的
$ build/windows-i386/avian -cp build/windows-i386/test Hello  #这个测试程序运行成功就代表编译成功了。

  

  然后将虚拟机嵌入打包,github上有详细的教程。等我以后再整理。。

3.打包并嵌入虚拟机

# building
platform=windows
#make platform=windows arch=i386/x86_64
arch=i386
project=Hello #project名称
mainClass=Hello #main函数所在类#i686-w64-mingw32- x86_64-w64-mingw32-
#这个是个坑爹的地方了,官网没有详细介绍。cygwin需要安装mingw-gcc...等同已系列的文件来支持32位的编译
#如果是32位编译,则ar,gcc,g++,dlltool,strip 要加前缀i686-w64-mingw32-
#如果是64位编译,则要加前缀x86_64-w64-mingw32- cd /cygdrive/d/java/avian/avian #转到avian的安装目录
export JAVA_HOME=/cygdrive/d/Java/jdk1.7.0_17# 第一次需要通过make指令编译avian,如不指定平台,默认就是本地平台。注:在shell中\是换行的意思
#make platform=${platform} arch=${arch}#Embedding
#在嵌入之前,需要通过eclipse编写一个
mkdir ../projects/${project}
cd ../projects/${project}
i686-w64-mingw32-ar x ../../avian/build/${platform}-${arch}/libavian.a
#cp ../../avian/build/${platform}-${arch}/classpath.jar boot.jarcat >Hello.java <<EOF
public class Hello {public static void main(String[] args) {System.out.println("hello, world!");}
}
EOF
javac -bootclasspath boot.jar Hello.java
#jar u0f boot.jar Hello.class../../avian/build/${platform}-${arch}/binaryToObject/binaryToObject boot.jar boot-jar.o _binary_boot_jar_start _binary_boot_jar_end ${platform} ${arch}
cat >embedded-jar-main.cpp <<EOF
#include "stdint.h"
#include "jni.h"
#include "stdlib.h" #if (defined __MINGW32__) || (defined _MSC_VER)
#  define EXPORT __declspec(dllexport)
#else
#  define EXPORT __attribute__ ((visibility("default"))) \__attribute__ ((used))
#endif#if (! defined __x86_64__) && ((defined __MINGW32__) || (defined _MSC_VER))
#  define SYMBOL(x) binary_boot_jar_##x
#else
#  define SYMBOL(x) _binary_boot_jar_##x
#endifextern "C" {extern const uint8_t SYMBOL(start)[];extern const uint8_t SYMBOL(end)[];EXPORT const uint8_t*bootJar(unsigned* size){*size = SYMBOL(end) - SYMBOL(start);return SYMBOL(start);}} // extern "C"extern "C" void __cxa_pure_virtual(void) { abort(); }int
main(int ac, const char** av)
{JavaVMInitArgs vmArgs;vmArgs.version = JNI_VERSION_1_2;vmArgs.nOptions = 1;vmArgs.ignoreUnrecognized = JNI_TRUE;JavaVMOption options[vmArgs.nOptions];vmArgs.options = options;options[0].optionString = const_cast<char*>("-Xbootclasspath:[bootJar]");JavaVM* vm;void* env;JNI_CreateJavaVM(&vm, &env, &vmArgs);JNIEnv* e = static_cast<JNIEnv*>(env);jclass c = e->FindClass("${mainClass}");if (not e->ExceptionCheck()) {jmethodID m = e->GetStaticMethodID(c, "main", "([Ljava/lang/String;)V");if (not e->ExceptionCheck()) {jclass stringClass = e->FindClass("java/lang/String");if (not e->ExceptionCheck()) {jobjectArray a = e->NewObjectArray(ac-1, stringClass, 0);if (not e->ExceptionCheck()) {for (int i = 1; i < ac; ++i) {e->SetObjectArrayElement(a, i-1, e->NewStringUTF(av[i]));}e->CallStaticVoidMethod(c, m, a);}}}}int exitCode = 0;if (e->ExceptionCheck()) {exitCode = -1;e->ExceptionDescribe();}vm->DestroyJavaVM();return exitCode;
}
EOFi686-w64-mingw32-g++ -fno-exceptions -fno-rtti -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/win32" -D_JNI_IMPLEMENTATION_ -c embedded-jar-main.cpp -o main.oi686-w64-mingw32-dlltool -z ${project}.def *.o
i686-w64-mingw32-dlltool -d ${project}.def -e ${project}.exp
i686-w64-mingw32-gcc ${project}.exp *.o -L../../win32/lib -lmingwthrd -lz -lws2_32 \-lIphlpapi -mwindows -mconsole -o ${project}.exe
i686-w64-mingw32-strip --strip-all ${project}.exe

  eclipse工程需要去除jre ,然后引入avian/build/windows-xxx/classpath.jar,导出runnable jar包.

导出之后复制到项目目录中,更名为boot.jar.然后把命令清单复制到cygwin的命令行窗口执行就行了

4.swt配置

在avian的官网有swt的zip包,网上也有介绍,不过安装时需要注意的是jar包里面只能有一个dll文件,多了貌似会冲突。。

转载于:https://www.cnblogs.com/Mr-Nobody/p/3855914.html

win8.1 cygwin编译java轻量虚拟机avian相关推荐

  1. Multipass - 一个轻量虚拟机管理器

    Multipass 是一个轻量虚拟机管理器,是由 Ubuntu 运营公司 Canonical 所推出的开源项目.运行环境支持 Linux.Windows.macOS.在不同的操作系统上,使用的是不同的 ...

  2. java 轻量数据库_DBTree是一个springboot2 + vue-element-template实现的轻量数据库表结构查看及管理工具...

    DBTree简介 DBTree是一个WEB版的轻量数据库表结构查看及管理工具,相比phpMyAdmin, DBTree只专注于方便开发查看表结构信息和 注释维护.通过树形展示库表结构,可以对表进行自定 ...

  3. java轻量分布式框架_推荐5个强大的Java分布式缓存框架

    在开发中大型Java软件项目时,很多Java架构师都会遇到数据库读写瓶颈,如果你在系统架构时并没有将缓存策略考虑进去,或者并没有选择更优的缓存策略,那么到时候重构起来将会是一个噩梦.动宝儿为了帮助大家 ...

  4. 拥有一台你的轻量应用服务器Lighthouse

    本文来自微信公众号:腾讯云服务器(id:TencentCVM),作者腾讯云煮鸡. 腾讯云轻量应用服务器 Lighthouse 自从 7 月 13 日正式公测之后,用户反响十分热烈,已吸引大量中小企业和 ...

  5. 国产LINUX服务器操作系统openEuler下的轻量开源虚拟化工具stratovirt

    StratoVirt设计 概述 StratoVirt是一种基于Linux内核的虚拟机(KVM)的开源轻量级虚拟化技术: StratoVirt在保持传统虚拟化的隔离能力和安全能力的同时,降低了内存资源消 ...

  6. Java的锁机制--偏向锁、轻量锁、自旋锁、重量锁

    基础知识 线程切换代价 Java的线程是映射到操作系统的原生线程之上的,如果阻塞或唤醒一个线程就需要操作系统介入,需要在用户态和内核态之间切换,该切换会消耗大量的系统资源,因为用户态和内核态均有各自专 ...

  7. voyage java_GitHub - yezilong9/voyage: 采用Java实现的基于netty轻量的高性能分布式RPC服务框架...

    Voyage Overview 采用Java实现的基于netty轻量的高性能分布式RPC服务框架.实现了RPC的基本功能,开发者也可以自定义扩展,简单,易用,高效. Features 服务端支持注解配 ...

  8. 阿里云轻量云服务器部署java项目

    阿里云轻量云服务器部署java项目 前言:阿里云最新推出了轻量云服务器,说是可以简化配置.看重他是因为带宽明显提升.就继续照着ecs服务器的方式安装了一系列环境.系统是阿里云的Centos7.3.JD ...

  9. multipass基础入门,搭建本地迷你云,一个比VMware轻量的虚拟机软件

    介绍 multipass是一款轻量,且开源的虚拟机. Multipass是一个灵活.强大的工具,可用于多种用途.在其最简单的形式下,它可以用来在任何主机上快速创建和销毁Ubuntu虚拟机(实例).在更 ...

最新文章

  1. windows cmd执行git log命令中文显示乱码
  2. lwip之数据收发流程_2
  3. qt中设置QCheckBox的文本与勾选框之间的距离
  4. 汉仪尚巍手书有版权吗_为什么“汉仪尚巍手书”会大行天下?
  5. 90行代码让微信地球转起来,太酷了!(python实现)
  6. 微信3.3.0 for Mac全新发布:新增视频号 可搜索微信号添加朋友
  7. activiti学习笔记---常见异常
  8. 用 Zabbix 监控值统计每个月触发器告警次数
  9. STM32——库函数版——数码管动态显示程序
  10. 【Scratch案例实操】Scratch小狗散步 scratch编程案例教学 scratch创意编程 少儿编程教案
  11. 基于JavaEE的办公OA系统的设计与实现
  12. python生成Excel透视表
  13. table总结insertRow、deleteRow
  14. OpenGL三维变换与三维投影实例(行星绕日旋转)
  15. PHP 常用字符串、数组处理函数
  16. word中本页有空白,一回车自动换下一页,解决办法如下
  17. 汇编语言学习之基本指令(上)
  18. 高通平台之TP代码分析
  19. 需求定律公式和需求弹性推导——《可以量化的经济学》
  20. 中国燃料电池行业“十四五”规划及需求规模分析报告2021-2027年

热门文章

  1. 关于解答Chn域名问题
  2. 基于java的车辆维护系统设计_基于SSM车辆维修管理系统-JavaWeb汽车保养管理系统...
  3. pythonweb开发实战pdf百度贴吧_Python Web自动化测试入门与实战,从入门到入行
  4. 服务器不支持 tls 重新协商修正,OpenSSL安全重新协商失败
  5. reshape(1,-1)与reshape(-1,1)的理解
  6. 【毕业设计源码】基于小程序蔬菜/零食商城系统
  7. 电脑微信关闭自动保存_微信自动保存图片怎么关闭?微信自动保存图片在哪关?...
  8. 2-3-2 rsync+inotify备份同步数据
  9. 做自己的决定,自己的路自己走。
  10. Vrep-基础部分(一)