游侠怎么设置java路径_使用小型虚拟机avian将Java转为本地程序

avian是一个小型的Java虚拟机,实现了Java的部分基本功能。具体API可以看

这里。不过这个虚拟机只提供源代码,需要你在linux、MSYS或Cygwin下编译好后才能使用,我在MSYS下尝试了一下,总是报错,最后只好转到Ubuntu下面才成功编译。

编译过程很简单,只要遵照他的提示就可以了,不过事先肯定是要装好GCC和JDK的(推荐OpenJDK),目标为win32平台时,还需要win32的头文件和库,可以从它的git站点

下载。 下载后解压到和avian源文件夹并列放置。

$ export JAVA_HOME=/usr/local/java #JDK位置

$ make platform=windows arch=i386

make后面的平台和架构都有其他的选项,比如linux/darwin x86_64等,具体参数可以看

这里,编译完成后在build目录下应该有个windows-i386文件夹,里面就是编译好的虚拟机和示例程序。

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

avian 小型JAVA虚拟机(window-i386版本)

mingw 交叉编译环境(现在更加新的可以采用ming-w64来编译)

步骤1

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

mkdir ${project}

cd ${project}

ar x ../windows-i386/libavian.a

cp ../windows-i386/classpath.jar boot.jar

步骤2

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

步骤3

把上面生成的 JAR  包转为目标文件。

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

步骤4

建立main.cpp文件

/*

* 调用Java类方法的模块

*/

#include "stdint.h"

#include "jni.h"

#if (defined __MINGW32__) || (defined _MSC_VER)

# define EXPORT __declspec(dllexport)

#else

# define EXPORT __attribute__ ((visibility("default")))

#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"

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("-Xbootclasspath:[bootJar]");

JavaVM* vm;

void* env;

JNI_CreateJavaVM(&vm, &env, &vmArgs);

JNIEnv* e = static_cast(env);

jclass c = e->FindClass("Hello");//在这个地方替换包含main方法的类

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;

}

步骤5

编译和链接,下面的程序名称如msvc++都是我取的别名,因为原名称实在太长了,应该是i586-mingw32msvc-c++(或者也有可能会是i686-xxx等,不一定),不同的mingw版本可能会有所不同,${project}就是你工程的名称。

export JAVA_HOME=/usr/lib/jvm/java-6-openjdk

msvc++ -I$JAVA_HOME/include -I$JAVA_HOME/include/win32 -D_JNI_IMPLEMENTATION_ -c main.cpp -o main.o

msdlltool -z ${project}.def *.o

msdlltool -d ${project}.def -e ${project}.exp

msvc++ ${project}.exp *.o -L../win32/lib -lmingwthrd -lm -lz -lws2_32 -mwindows -mconsole -o ${project}.exe #去掉-mconsole后不会出现Console,直接显示GUI。

msstrip --strip-all ${project}.exe

其中java可以是更高的版本,最后把{project}.exe复制回Windows即可,在只加入SWT的情况下,程序的大小是2M多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值