0

我使用 JNI 接口从 C 代码调用 Java 代码。编译时我使用以下命令:

gcc -g -I/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/include/ -I/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64 /include/linux/ -L/usr/bin/java -L/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/amd64/server/ -ljvm calljava.c

我使用以下代码来创建 JVM:

JNIEnv* create_vm() 
{
    JavaVM* jvm;
    JNIEnv* env;
    JavaVMInitArgs args;
    JavaVMOption options[1];
    args.version = JNI_VERSION_1_2;
    args.nOptions = 1;
    options[0].optionString = "-Djava.class.path=<classpath>";
    args.options = options;
    args.ignoreUnrecognized = JNI_FALSE;
    JNI_CreateJavaVM(&jvm, (void **)&env, &args);
    return env;
}

我的问题是:JVM 的路径是否在二进制文件中硬编码?我们可以在运行时指定 java 可执行文件的路径吗?如果有办法做到这一点,任何人都可以帮助我使用可用于此的编译时间标志吗?

提前致谢!

4

1 回答 1

1

根本不使用“java 可执行文件”。当你编译和链接你的代码时,你链接到一个共享库,当你启动你的可执行文件时,它的位置由系统在运行时确定。

除非您自己从已知位置动态加载 jvm 共享库(并随后查找并调用其中的函数),否则系统将确定“JVM 的路径”。

通常,如果您想针对特定版本运行,您会在应用程序的分发中包含该版本,并配置应用程序的启动以确保使用正确的共享库(通过适当设置环境的脚本,动态加载它,或其他系统特定的方法)。

于 2013-07-22T22:59:05.957 回答