0
是否存在一种与平台无关的方式来查找C语言中的JVM库(Linux上的libjvm.so和Windows上的jvm.dll)的位置?C:以编程方式查找JVM库文件位置
我试过使用libltdl API,它可以在一些(也许很多)平台上工作,但它在Ubuntu上不起作用。
是否存在一种与平台无关的方式来查找C语言中的JVM库(Linux上的libjvm.so和Windows上的jvm.dll)的位置?C:以编程方式查找JVM库文件位置
我试过使用libltdl API,它可以在一些(也许很多)平台上工作,但它在Ubuntu上不起作用。
#include <stdio.h>
#include <stdlib.h>
#include <ftw.h>
#include <string.h>
static char* jvm_lib_fpath;
static int check_file(const char *fpath, const struct stat *sb, int typeflag) {
static const char LINUX_LIB[] = "libjvm.so";
static const char WINDOWS_LIB[] = "jvm.dll";
const char *libs[] = {LINUX_LIB, WINDOWS_LIB};
int i;
for (i = 0; i < 2; i++) {
const char* lib = libs[i];
const size_t m = strlen(lib);
const size_t n = strlen(fpath) - m;
const char* test = &fpath[n];
if (strcmp(test, lib) == 0) {
const size_t fpath_len = strlen(fpath) + 1;
jvm_lib_fpath = (char*) malloc(fpath_len * sizeof(char));
if (jvm_lib_fpath == NULL) return -1;
strcpy(jvm_lib_fpath, fpath);
return 1;
}
}
return 0;
}
static int set_jvm_lib_fpath() {
char* java_home = getenv("JAVA_HOME");
int result = ftw(java_home, check_file, 128);
return result;
}
int main() {
int result = set_jvm_lib_fpath();
if (result == 1) {
printf("jvm_lib_fpath: '%s'\n", jvm_lib_fpath);
} else {
printf("Could not find JVM library file.\n");
}
if (jvm_lib_fpath) {
free(jvm_lib_fpath);
}
return 0;
}
虽然这是一个非常好的开始,但请记住,有些平台已将Java正确集成到系统中,以便不需要将JAVA_HOME设置为正确执行java,加载它的库。为了找到它,即使知道'java'的路径也可能是开始的一步,因为有'alternatives'系统。如果没有JAVA_HOME或更明显的方法,大部分自动检测都会使用“可能”位置列表作为最后的手段。 –