文档章节

win8.1 cygwin编译java轻量虚拟机avian

zaaack
 zaaack
发布于 2014/10/14 23:39
字数 1454
阅读 85
收藏 0

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.jar

cat >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
#endif

extern "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;
}
EOF


i686-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.o
	 
i686-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文件,多了貌似会冲突。。

 

© 著作权归作者所有

zaaack

zaaack

粉丝 33
博文 92
码字总数 43513
作品 8
长沙
程序员
私信 提问
5 款用来开发 iOS 应用的 Java 开源工具

苹果iOS系统的封闭性一直广为其他语言(如Java)开发者诟病,但随着第三方工具的不断壮大,开发人员逐渐摆脱政策束缚,开始使用自己熟悉的语言来编写iOS本地应用,或将其他平台上的应用移植到...

oschina
2013/03/29
7.4K
15
Avian 0.7 发布,小型的 Java 虚拟机

Avian 0.7 包含很多 bug 修复,增加对 FreeBSD 的支持,改进对 Scala 的支持,增加使用 Android/Harmony 类库作为 OpenJDK 和 Avian 库的替代品。 Avian 是一个轻量级的 Java 虚拟机和类库,...

oschina
2013/07/11
2.6K
4
用JavaScript编写一个Java虚拟机?谈谈哗众取宠的BicaVM

今日目睹某网络新闻,开篇明义便包含如下几行文字【程序员Artur Ventura,这位超级大牛,用JavaScript写了一个java虚拟机BicaVM】 继而再读,惊见其中“超级大牛”、“神人”等溢美之词不绝于...

兔bug
2011/11/24
18
1
用JavaScript编写一个Java虚拟机?谈谈哗众取宠的BicaVM

http://www.cnbeta.com/articles/163172.htm 感谢鹏凌三千的投递 新闻来源:原创 今日目睹某网络新闻,开篇明义便包含如下几行文字【程序员Artur Ventura,这位超级大牛,用JavaScript写了一个...

mallon
2011/11/23
1K
9
Avian 1.0 发布,轻量级 Java 虚拟机

Avian 1.0 发布,Avian 是一个轻量级的 Java 虚拟机和类库,提供了 Java 特性的一个有用的子集,适合开发跨平台、自包容的应用程序。 该版本包含近一年的 bug 修复,提升对 OpenJDK 和 Andr...

oschina
2014/05/20
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

IT兄弟连 Java语法教程 编写Java源代码

现在我们来一步一步的编写第一个Java程序,鼎鼎大名的“HelloWorld”。 编写Java源代码 编写Java源代码可以使用任何无格式的文本编辑器,在Windows操作系统上可以使用记事本、Edit Plus等程序...

老码农的一亩三分地
12分钟前
2
0
JavaScript箭头函数中的this详解

前言 箭头函数极大地简化了this的取值规则。 普通函数与箭头函数 普通函数指的是用function定义的函数: var hello = function () {console.log("Hello, Fundebug!");} 箭头函数指的是用...

开元中国2015
23分钟前
2
0
ETL测试工具简介

ETL测试 ETL测试过程与其他测试过程类似,包括一些阶段。 确定业务需求 测试计划 设计测试用例和测试数据 测试执行和错误报告 总结报告 测试结束 ETL测试的类型 生产验证测试: 也称为表平衡...

python测试开发人工智能安全
35分钟前
1
0
OSChina 周四乱弹 —— 不能空腹吃早餐

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @for_ :#今日歌曲推荐# 很好听的钢琴曲,节奏简单,有一点伤感。分享Fabrizio Paterlini的单曲《Veloma》: 《Veloma》- Fabrizio Paterlini ...

小小编辑
今天
1K
13
探讨android更新UI的几种方法

作为IT新手,总以为只要有时间,有精力,什么东西都能做出来。这种念头我也有过,但很快就熄灭了,因为现实是残酷的,就算一开始的时间和精力非常充足,也会随着项目的推进而逐步消磨殆尽。我...

天王盖地虎626
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部