【发布时间】:2022-01-01 15:34:23
【问题描述】:
我正在尝试熟悉 JNI API,但无法获得要编译的示例 c++ 程序。我得到了相同的示例来在 linux 中编译和运行(在下面的链接中发布问题之后),但无法在 Windows 中编译它;我正在使用 mingw g++。我已将所有包含路径更改为 Windows 路径,并且 jni.h 位于编译时,但不是 jvm.dll。
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 `_imp__JNI_CreateJavaVM@12'
以及正在编译的 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 构建的库可能会出现问题。请参阅此互操作性帖子:mingw.org/wiki/MixingCompilers。您是否考虑过改用 Visual Studio?
-
@maba- 我也在 Visual Studio 中尝试过,但我得到了相同的结果。你知道 jvm.dll 是用 MSVC 构建的吗?我猜它不是,但这只是一个猜测。
-
@RBI 它是用 MSVC 构建的。函数名称在导出表中被破坏的方式是一个赠品。
标签: c++ windows java-native-interface