我想熟悉JNI API,但无法获得一个示例C++程序来编译。我得到了相同的样本来编译和运行在Linux中(在下面的链接发布问题后),但不能得到它在Windows编译;我正在使用mingw g ++。我已将所有包含路径更改为windows路径,并且jni.h位于编译时,但不是jvm.dll。未定义的引用'JNI_CreateJavaVM'窗口
undefined reference to `JNI_CreateJavaVM' linux
这里是我试过的命令使用编译:
g++ -g -I"C:\Program Files (x86)\Java\jdk1.7.0_21\include" -I"C:\Program Files (x86)\Java\jdk1.7.0_21\include\win32" -L"C:\Program Files (x86)\Java\jdk1.7.0_21\jre\bin\server" callJava.cpp -ljvm
和...
**same as above with the additional** : -L"C:\Program Files (x86)\Java\jdk1.7.0_21\lib"
我得到的错误是:
undefined reference to `[email protected]'
和正在编译的cpp:
#include <jni.h>
int main(){
//firstTest();
JavaVM *jvm;
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options[1];
options[0].optionString = "-Djava.class.path=C:/Users/Ron/Dropbox/jni/simple/ctojava/win";
vm_args.version = JNI_VERSION_1_6;
vm_args.options = options;
vm_args.nOptions = 1;
vm_args.ignoreUnrecognized = JNI_FALSE;
int res = JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args);
jclass cls = env->FindClass("Hello");
jmethodID mid = env->GetStaticMethodID(cls, "staticInt", "(I)I");
env->CallStaticVoidMethod(cls, mid,10);
jvm->DestroyJavaVM();
}
我看了很多例子,但仍找不到解决方案。任何帮助表示赞赏!
更新:我敢肯定的是的jvm.dll位于因为如果我删除了-L“path_to_jvm”然后我得到的错误:
mingw32/bin/ld.exe: cannot find -ljvm
就像我说的,这个确切的方法在Linux中工作,还有什么我缺少的Windows?
链接到使用g ++创建的MSVC库可能会有问题。看到这个互操作性的帖子:http://www.mingw.org/wiki/MixingCompilers。你有没有考虑过使用Visual Studio呢? – maba
@ maba-我已经尝试在视觉工作室,但我得到了同样的结果。你知道jvm.dll是用MSVC构建的吗?我猜这不是,但这只是一个猜测。 – RBI
@RBI它是用MSVC构建的。函数名称在输出表中被破坏的方式是免费的。 – greatwolf