【问题标题】:Makefile for JNI invocation not working - undefined reference to JNI_CreateJavaVM用于 JNI 调用的 Makefile 不起作用 - 未定义对 JNI_CreateJavaVM 的引用
【发布时间】:2016-08-23 18:17:11
【问题描述】:

我有一个任务如下的makeifile。当我编译时,我得到一个链接器错误,但我不知道为什么,因为我正在链接/包含到 java 库。我验证 $JAVA_HOME 存在并且 libjvm.so 存在于/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/server

出错:

(.text+0x5a): undefined reference to `JNI_CreateJavaVM'
collect2: error: ld returned 1 exit status

制作文件:

my_program:
    gcc -L${JAVA_HOME}/jre/lib/amd64/server/ \
    -I${JAVA_HOME}/include/ \
    -I${JAVA_HOME}/include/linux/ \
    -ljvm \
    my_program.c
run: my_program
   ./a.out

c 字段:

#include <jni.h>

int main ( int argc, char **argv ) {
     printf("hello\n");
     return 0;
}


JNIEnv *create_vm(JavaVM **jvm){
    JNIEnv *env = NULL;
    JavaVMInitArgs vm_args;
    JavaVMOption options;
//  options.optionString = "-Djava.class.path=" JAVA_PROG_PATH;
//  vm_args.version = JNI_VERSION_1_7;
    vm_args.nOptions = 1;
    vm_args.options = &options;
    vm_args.ignoreUnrecognized = 0;
    int ret = JNI_CreateJavaVM(jvm, (void **)&env, &vm_args);
    char *failed = "nothing";
    if(ret < 0){
        goto create_vm_error;

    }
    return env;

    lookup_error:
        dlog(0, "Error looking up class or method %s.\n", failed);
        (**jvm)->DestroyJavaVM(*jvm);
    create_vm_error:
        *jvm = NULL;
        return NULL;
}

【问题讨论】:

    标签: java c makefile java-native-interface


    【解决方案1】:

    听起来很愚蠢 - 将 -ljmv 移到 my_program.c 之后:

    my_program:
        gcc -L${JAVA_HOME}/jre/lib/amd64/server/ \
        -I${JAVA_HOME}/include/ \
        -I${JAVA_HOME}/include/linux/ \
        my_program.c \
        -ljvm
    run: my_program
       ./a.out
    

    这是一个常见的错误,因为 GCC 要求在库规范之前提供您的编译单元 (my_program.c)(是的,编译单元应该严格位于库的左侧),以便它可以分辨出哪些符号它需要从那个图书馆。如果顺序颠倒,gcc会扣除不需要的符号,库将不会被使用...

    如果我每次遇到这种情况都能得到一分钱

    【讨论】:

    • 好的,这让我更进一步。我能够构建我的 a.out。但是,当我运行它时,我收到一个关于 .so 找不到的错误。 ./a.out: error while loading shared libraries: libjvm.so: cannot open shared object file: No such file or directory
    • 为方便修复,请将libjvm.so 复制到您正在运行a.out 的同一目录中。有关为什么会发生这种情况的完整解释(剧透:因为 libjvm.so 不在您的加载程序被指示搜索的目录中)请看这里:linuxmafia.com/faq/Admin/ld-lib-path.html
    • 好的,我正在研究如何将复制命令添加到我的 makefile 中
    • 即使我手动复制 libjvm.so 并尝试运行 a.out,我仍然收到有关 libjvm.so 丢失的错误。
    • 尝试像这样运行您的代码:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${JAVA_HOME}/jre/lib/amd64/server;./a.out。请阅读我提供的链接以了解您在做什么以及为什么它可能不好
    猜你喜欢
    • 1970-01-01
    • 2022-01-01
    • 2018-05-25
    • 2022-11-02
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多