java - C:以编程方式查找 JVM 库文件位置

标签 java c jvm

是否有独立于平台的方法来使用 C 查找 JVM 库(Linux 上的 libjvm.so 和 Windows 上的 jvm.dll)的位置?

我试过使用 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 - C:以编程方式查找 JVM 库文件位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33570133/

相关文章:

c - 子进程执行某些系统命令的结果无法通过管道发送到父进程

java - 用 Java 编写简单高效的数据库自定义 ORM 代码

java - 从 Tic Tac Toe 中获得获胜者

java - 哪里可以下载JMXMP?

c++ - 如何在不同的功能中使用队列?

jvm - klassoop 和 instanceklass 之间的真正区别是什么?

c# - 生成所有递增的数字

在 C - AIX 机器中计算时间

java - 如何验证wrapper.conf中的Java参数

java - 如果没有余数,双除法等于整数除法吗?