Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JNI调用的Makefile不工作-对JNI_CreateJavaVM的未定义引用_Java_C_Makefile_Java Native Interface - Fatal编程技术网

JNI调用的Makefile不工作-对JNI_CreateJavaVM的未定义引用

JNI调用的Makefile不工作-对JNI_CreateJavaVM的未定义引用,java,c,makefile,java-native-interface,Java,C,Makefile,Java Native Interface,我有一个makeifile,任务如下。当我编译时,我得到一个链接器错误,但我不确定为什么,因为我正在链接/包括java libs。我验证了$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 statu

我有一个makeifile,任务如下。当我编译时,我得到一个链接器错误,但我不确定为什么,因为我正在链接/包括java libs。我验证了$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;
}
#包括
int main(int argc,字符**argv){
printf(“hello\n”);
返回0;
}
JNIEnv*创建虚拟机(JavaVM**jvm){
JNIEnv*env=NULL;
JavaVMInitArgs vm_args;
JavaVMOption选项;
//options.optionString=“-Djava.class.path=”JAVA\u PROG\u path;
//vm_args.version=JNI_version_1_7;
vm_args.nOptions=1;
vm_args.options=&options;
vm_args.ignoreunrecogned=0;
int ret=JNI_CreateJavaVM(jvm,(void**)&env和vm_args);
char*failed=“nothing”;
如果(ret<0){
转到创建虚拟机错误;
}
返回环境;
查找错误:
dlog(0,“查找类或方法%s时出错。\n”,失败);
(**jvm)->DestroyJavaVM(*jvm);
创建虚拟机错误:
*jvm=NULL;
返回NULL;
}

听起来很愚蠢-移动-ljmv到my_程序之后。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:加载共享库时出错:libjvm.so:无法打开共享对象文件:没有这样的文件或目录
要简单修复,请复制
libjvm.so
到您正在运行的同一目录
a.out
。有关发生这种情况的原因的完整戈尔解释(扰流板:因为libjvm.so不在加载程序被指示搜索的目录中)请看这里:好的,我正在试图找出如何向我的Makefile添加一个copy命令,即使我手动复制libjvm.so并尝试运行a.out,我仍然得到关于libjvm.so的错误。请尝试这样运行代码:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${JAVA_HOME}/jre/lib/amd64/server;/a.out
。请阅读我提供的链接,了解您正在做什么,以及为什么它可能不好