gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:34:38 24 4
gpt4 key购买 nike

我有一个 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;
}

最佳答案

听起来很愚蠢 - 将 -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 会扣除不需要的符号,库将不会被使用...

如果每次发生这种事我都能得到一分钱

关于java - JNI 调用的 Makefile 不起作用 - 未定义对 JNI_CreateJavaVM 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39108134/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com