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

使用JNI创建java可执行文件?,java,java-native-interface,invocation-api,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文件 使用GCJ将Java编译为可执

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

使用GCJ将Java编译为可执行文件并非始终有效,在使用反射和其他项(如UI类)方面存在限制


如果您将Java代码转换为库或简单的另一个模块,那么您可以链接到它并简单地运行它,而不需要JVM。

我最初的反应是,如果您能让它工作并执行它,我会感到震惊。但后来我开始考虑这个问题,也许你可以用一个自定义类加载器来实现。如果将jar作为资源嵌入exe中,则与将jar字节存在于任何文件(无论是否为exe)的特定偏移量处完全相同

因此,这里有一个潜在的策略:实现一个自定义类加载器,该加载器接受该文件中jar资源的exe路径和偏移量。这将使用ZipFile的自定义版本,该版本的读取使用固定的索引偏移量(不幸的是,不可能使用ZipFile本身-但是如果您获取ZipFile的源代码,那么在需要添加偏移量的地方应该非常明显)

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


听起来像是一个有趣的项目(尽管,正如其他人所指出的,您所做的事情没有太多的安全性……我想您可以加密嵌入的jar并向类加载器添加解密代码,但是您需要决定您要将这件事做多远).

反思应该与OP所追求的策略配合得很好。@Kevin Day-我猜你是因为我把反思放在那里而责骂我的。你没有按照我的链接指向GCJ。我已经编辑了我的文章,以使它更明确:(公平的‘NoGo考虑TIN颠倒;-)“我不想把我的JAR文件暴露给每个人,因为安全原因”,把它放在EXE中,并把EXE发送给某人,您正在公开它。是的,但是exe不能像字节码那样轻松地反编译,但是如果您只是将JAR文件打包到.exe中,则不需要进行“反编译”即可将其导出。