架构 x86_64 的未定义符号:JNI_CreateJavaVM OS-X Xcode

Posted

技术标签:

【中文标题】架构 x86_64 的未定义符号:JNI_CreateJavaVM OS-X Xcode【英文标题】:Undefined symbols for architecture x86_64: JNI_CreateJavaVM OS-X Xcode 【发布时间】:2014-03-14 05:42:43 【问题描述】:

我正在尝试使用 Mac OS-X Mountain Lion 上的 Xcode 编译以下 C++ 代码以创建 Java 虚拟机:

JNIEnv * createVM(JavaVM **jvm)
    JNIEnv * retEnv = NULL;
    JavaVMInitArgs vm_args = *new JavaVMInitArgs();
    JavaVMOption *options = new JavaVMOption[1];

    std::string sJavaInstallPath = "-Djava.class.path=" + findJavaPath();

    if(sJavaInstallPath == "-Djava.class.path=")
        return NULL;
    

    options[0].optionString = const_cast<char*>(sJavaInstallPath.c_str());
    vm_args.version = JNI_VERSION_1_6;
    vm_args.nOptions = 1;
    vm_args.options = options;
    vm_args.ignoreUnrecognized = false;

    long status = JNI_CreateJavaVM(jvm, (void**)&retEnv, &vm_args);

    if(status == JNI_ERR)
        std::cout << "Failure: Unable to load JVM \t Exit" << std::endl;
    else if(status == JNI_OK)
        std::cout << "CreateVM:\t\tJVM loaded successfully" << std::endl;
    

    delete options;
    return retEnv;
;

这给出了以下错误: 架构 x86_64 的未定义符号:“_JNI​​_CreateJavaVM”。

来自这些类似的问题:


undefined reference to `JNI_CreateJavaVM' linux

How can I use JNI in C++ to use a Java class?

undefined symbol: JNI_CreateJavaVM in Linux

http://lists.apple.com/archives/java-dev/2005/Apr/msg00067.html

http://lists.apple.com/archives/java-dev/2005/Apr/msg00068.html


我发现我缺少对 libjvm.dylib 的库引用。问题是我不确定如何让 Xcode 识别/包含用于链接的库,

我尝试将以下目录(所有这些目录都包含一个 libjvm.dylib 文件)放入 Xcode 中的 Library Search Paths 列表中,但没有结果:


/System/Library//Java/JavaVirtualMachines/1.6.0.jdk/Contents/Libraries/

/Library//Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/server/

/System/Library/Frameworks/JavaVM.framework/Libraries/


我对 OS-X 和 Xcode 还是很陌生,其他问题的答案都与使用 gcc 或 g++ 编译有关,我对这方面的经验更少,所以我需要知道的是:如何我告诉 Xcode 编译器在哪里可以找到 libjvm.dylib,以及我应该链接到哪个 libjvm.dylib?

【问题讨论】:

【参考方案1】:

好的,找到解决办法了,

相当于g++的

-L<library/to/link>

Xcode 中的设置是 Build Phases 标签下的 Link Binary with Libraries 设置, 不是我上面提到的库搜索路径列表。

而我需要链接的库实际上是 /System/Library/Frameworks/JavaVM.framework/JavaVM

不是 libjvm.dylib

【讨论】:

以上是关于架构 x86_64 的未定义符号:JNI_CreateJavaVM OS-X Xcode的主要内容,如果未能解决你的问题,请参考以下文章

GoogleMapsSDK:架构 x86_64 的未定义符号

Cordova - 架构 x86_64 的未定义符号

架构 x86_64 的未定义符号:MqtUtil

切换到调试时架构 x86_64 的未定义符号

Xcode 错误 - 架构 x86_64 的未定义符号?

GraphicsMagick,架构 x86_64 的未定义符号