0

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

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

我搜索了这个问题并遇到了这个帖子

答案是,如果我做对了,将 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 来编译我的代码。

我很高兴每一条建议

4

1 回答 1

0

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

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

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

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

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


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

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