我是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来编译我的代码。
我很高兴看到每一条建议
答案 0 :(得分:0)
没错,您需要将jvm
库添加到构建中。
jvm
。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的参数是每个4字节的3个指针),因此链接器需要32位版本的jvm.lib而不是64位位版。
BTW-您的java.class.path
看起来很可疑,原因有两个:
Tests
看起来像是一个类的名字。类路径应该是; - 包的根文件夹的路径的分隔列表。如果Tests
是默认包中的类,只需从类路径中删除Tests
。java
应搜索.class
文件的位置。如果您的项目配置为将.java
文件夹中的src
文件编译为.class
文件夹中的bin
文件,则将src
替换为bin
在你的班级路径中。