JNI,Eclipse中的Java到C ++:对'_imp__JNI_CreateJavaVM @ 12'的未定义引用

时间:2013-06-12 16:41:19

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

我是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都是64Bit。我正在使用MinGW GCC来编译我的代码。

我很高兴看到每一条建议

1 个答案:

答案 0 :(得分:0)

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

  1. 打开项目属性对话框。
  2. 选择C ++ Builder&gt;左侧的设置。
  3. 选择工具设置选项卡。
  4. 选择MinGW C ++ Linker&gt;库。
  5. 在“库”部分添加jvm
  6. 将路径添加到“库搜索路径”部分中的JDK lib文件夹。
  7. 我有一个指向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的参数是每个4字节的3个指针),因此链接器需要32位版本的jvm.lib而不是64位位版。


    BTW-您的java.class.path看起来很可疑,原因有两个:

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