作为完全不同的方法,为什么不滥用JAR底层的ZIP文件格式呢?ZIP文件将其元数据存储在文件的末尾,这意味着您可以简单地将ZIP文件附加到二进制文件中,运行嵌入式JVM,并将二进制文件添加到自己的类路径中.添加全部的selenium,然后只是一个重新包装到一个单一的uberjar的问题.
作为一个简单的例子,以Main.java为例:
class Main {
public static void main(String[] args) {
System.out.println("Hello from java");
}
}
和jni.cpp:
#include <jni.h>
#include <string>
int main(int argc, char **argv) {
JavaVM *jvm; /* denotes a Java VM */
JNIEnv *env; /* pointer to native method interface */
JavaVMInitArgs vm_args; /* JDK/JRE 6 VM initialization arguments */
JavaVMOption* options = new JavaVMOption[1];
std::string option = "-Djava.class.path=";
option += argv[0];
options[0].optionString = const_cast<char *>(option.c_str());
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.ignoreUnrecognized = false;
/* load and initialize a Java VM, return a JNI interface
* pointer in env */
JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
delete[] options;
/* invoke the Main.test method using the JNI */
jclass cls = env->FindClass("Main");
jmethodID mid = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V");
env->CallStaticVoidMethod(cls, mid);
/* We are done. */
jvm->DestroyJavaVM();
}
然后,您可以执行以下操作:
$ make jni
$ javac Main.java
$ jar cf code.jar Main.java
$ cat jni code.jar > jni-combined
$ ./jni-combined
Hello from java