【问题标题】:JNI, Java to C++ in Eclipse: undefined reference to '_imp__JNI_CreateJavaVM@12'Eclipse 中的 JNI、Java 到 C++:对“_imp__JNI_CreateJavaVM@12”的未定义引用
【发布时间】:2013-06-08 21:11:31
【问题描述】:

我是 C++ 和 JNI 的初学者,我想从我的 C++ 程序中调用 Java 方法。 编译(使用 Eclipse)时出现以下错误:

对“_imp__JNI_CreateJavaVM@12”的未定义引用

我搜索了这个问题,遇到了this post

答案是,如果我做对了,将 jvm 库包括到编译命令中。由于我不是手动编译的,我不确定如何让 Eclipse 做到这一点。有人可以为一个完整的初学者逐步解释一下吗?

这里是代码,以防编译命令不会改变任何东西并且代码有一些错误。 在这部分调用JNI_CreateJavaVM时显示错误:

JNIEnv* create_vm(JavaVM ** jvm) {

JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options;

/*
 * The following is a little messy, but options.optionString wants a char* not a string
 * So I convert the String-path to a char-array
 */
string stringPath = "-Djava.class.path=C:\\Users\\Chris\\workspacejava\\PP\\src\\Tests"; //Path to the java source code

int sLen = stringPath.length();

char javaPath [sLen + 1];
int i = 0;
for(; i < sLen; i++)
{

    javaPath[i] = stringPath[i];
}
javaPath[i] = '\0';

options.optionString = javaPath;
vm_args.version = JNI_VERSION_1_6; //JDK version. This indicates version 1.6
vm_args.nOptions = 1;
vm_args.options = &options;
vm_args.ignoreUnrecognized = 0;


int ret = JNI_CreateJavaVM(jvm, (void**)&env, &vm_args); //This call results in the error: undefined reference to '_imp__JNI_CreateJavaVM@12'
if(ret < 0)
    printf("\nUnable to Launch JVM\n");     
return env;}

我在这里调用这个函数:

    int main(int argc, char* argv[])
{
    JNIEnv *env;
    JavaVM * jvm;
    env = create_vm(&jvm);
    if (env == NULL)
        return 1;
    ...
    int n = jvm->DestroyJavaVM();
    return 0;
}

更多信息:(我不知道他们是否有帮助) 我使用的是 Windows 7。Eclipse 和 JDK 都是 64 位的。我正在使用 MinGW GCC 来编译我的代码。

我很高兴收到每条建议

【问题讨论】:

  • Eclipse CDT 支持各种工具链(例如 MinGW GCC、MSVC、Cygwin GCC)。你在这个项目中使用的是哪一个?
  • 我现在正在使用 MinGW GCC。但如果这会有所作为,我可以很容易地改变它。

标签: c++ eclipse java-native-interface undefined


【解决方案1】:

没错,您需要将jvm 库添加到您的构建中。

  1. 打开项目属性对话框。
  2. 选择左侧的 C++ Builder > 设置。
  3. 选择“工具设置”选项卡。
  4. 选择 MinGW C++ 链接器 > 库。
  5. 在库部分添加jvm
  6. 在库搜索路径部分添加 JDK lib 文件夹的路径。

我有一个指向 JDK 的 JRE 子文件夹的 JAVA_HOME 环境变量,因此我输入如下搜索路径:"${env_var:JAVA_HOME}/../lib",带引号是因为环境变量扩展为包含空格的路径。

现在,您可能安装了 32 位和/或 64 位 JDK。确保使用与编译器输出相同位数的文件。这包括首先在DLL search path 上使用正确的 jvm.dll 运行您的 exe。在 64 位 Windows 上,32 位 JDK 通常安装在 C:\Program Files (x86)\Java....

@12 表示您的编译器正在生成 32 位代码(JNI_CreateJavaVM 的参数是 3 个每个 4 字节的指针),因此链接器需要 32 位版本的 jvm.lib 而不是 64 位版本。


顺便说一句——您的 java.class.path 看起来很可疑,原因有两个:

  1. Tests 看起来像一个类的名称。类路径应该是一个 ; 分隔的包根文件夹的路径列表。如果Tests 是默认包中的一个类,只需从你的类路径中删除Tests
  2. Eclipse 通常使用单独的源文件夹和二进制文件夹来设置 Java 项目。类路径中的路径是 java 应该搜索 .class 文件的位置。如果您的项目配置为将src 文件夹中的.java 文件编译为bin 文件夹中的.class 文件,则在您的类路径中将src 替换为bin

【讨论】:

  • 非常感谢您的帮助。但是对于我尝试过的不同事情,我仍然会遇到不同的错误: 1. 我尝试在库搜索路径中包含 lib 的绝对路径(“C:\Program Files\Java\jdk1.7.0_21\lib”)。我得到了和以前一样的错误。但是我看到jvm.dll文件不在lib文件夹中。
  • 2.我包含了 jvm.dll 文件的绝对路径(“C:\Program Files\Java\jdk1.7.0_21\jre\bin\server”)。这导致了错误:C:\Program Files\Java\jdk1.7.0_21\jre\bin\server/jvm.dll:文件无法识别:文件格式无法识别。我也尝试在路径中使用“/”而不是“\”,但我得到了同样的错误。 3. 我用 JAVA_HOME 路径(“${env_var:JAVA_HOME}/bin/client”)试了一下,然后我得到错误:c:/mingw/bin/../lib/gcc/mingw32/4.6.2/。 ./../../../mingw32/bin/ld.exe:找不到-ljvm。我现在不知道如何继续。
  • 注意:我发现 3 个不同的 JDK 文件夹都包含一个 jvm.dll 文件(“Program Files\Java\jdk1.7.0_21”、“Program Files\Java\jre7”、“C: \Program Files (x86)\Java\jre7") 我尝试包含哪一个会有所不同吗?
  • jvm.dll 直到运行时才涉及。链接器需要知道 .lib 文件的路径,并被告知在 jvm.lib 中查找要链接的函数。
  • 当我给 Eclipse 提供 jvm.lib 文件的路径(“C:\Program Files\Java\jdk1.7.0_21\lib”)时,我得到了与开始时相同的错误:C:\ Users\Chris\workspacec++\JavaWrap\Debug/../CTest.cpp:65:未定义对 `_imp__JNI_CreateJavaVM@12 的引用。我做错了什么?有没有可能我错过了我应该早点做的事情?类似于将 jvm.lib-Path 包含到 Path 环境变量或类似的东西(我已经尝试过)。很抱歉,如果我对愚蠢的错误征询您的耐心,但我真的不知道如何继续......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2014-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多