使用JNI创建java可执行文件?

时间:2010-05-08 13:35:38

标签: java java-native-interface invocation-api

我正在尝试使用JNI,C / C ++和调用API在Windows平台下为Java程序创建可执行文件,我已经为我的程序创建了包含所有依赖项的jar文件。我想将它嵌入到exe文件中,我使用JNI调用API成功运行简单的主类(存在于文件系统中),我计划在C / C ++程序中添加jar文件作为资源。但我不知道如何运行该jar文件,一个选项是在文件系统上创建临时jar文件并使用java运行它但是我不想出于安全原因将我的jar文件暴露给每个人,我该如何运行使用JNI动态jar文件?

2 个答案:

答案 0 :(得分:2)

使用GCJ将Java编译为可执行文件不起作用,就使用反射和其他项目(如UI类Look at this page)而言存在限制。

如果您将Java代码转换为库或只是另一个模块,那么您可以链接到它并只需运行它而无需JVM。

答案 1 :(得分:1)

我最初的反应是,如果你能让它发挥作用并让它具有高效性,我会感到震惊。但后来我开始思考它,也许你可以使用自定义类加载器来解决这个问题。如果您将jar作为资源嵌入到exe中,那么将jar字节存在于任何文件中的特定偏移量(无论是否为exe)都是完全相同的。

所以,这是一个潜在的策略:实现一个自定义类加载器,它接受该文件中jar资源的exe路径和偏移量。这将使用ZipFile的自定义版本,它使用固定的索引偏移量来读取它(不幸的是,它不可能使用ZipFile本身 - 但是如果你抓住了ZipFile的源代码,它应该是非常明显的你会在哪里需要添加偏移量。)

这里有一个引导问题(如何加载自定义类加载器?) - 但我认为可以从JNI方面做到这一点。基本上,您将加载器的.class文件存储为exe中的单独资源,将其完全加载到内存中,然后使用JNI调用构造它。这将是一个麻烦,但它只适用于一个类,然后您可以让Java运行时接管其余的。

听起来像一个有趣的项目(虽然,正如其他人指出的那样,你正在做的事情没有太大的安全性......我想你可以加密嵌入式jar并将解密代码添加到类加载器中,但是你我有点想决定你想拿这个东西走多远。)