gpt4 book ai didi

c++ - 对 `JNI_CreateJavaVM' 窗口的 undefined reference

转载 作者:可可西里 更新时间:2023-11-01 13:11:41 24 4
gpt4 key购买 nike

我正在尝试熟悉 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 我还缺少什么?

最佳答案

您遇到的问题可以简单概括为名称修饰问题。链接器找不到具有给定名称的函数,因为它在 jvm.dll 中的装饰不同。

查看您遇到的初始错误:

undefined reference to '_imp__JNI_CreateJavaVM@12'

它暗示了两件事:

  1. 末尾的 @12 后缀表示 JNI_CreateJavaVM 假定使用 stdcall 约定。
  2. _imp_ 前缀表示该函数来自一个导入库,该库重定向到一个外部加载的 dll,该函数在其导出表中可见。

jni.h中的函数原型(prototype):

_JNI_IMPORT_OR_EXPORT_ 
jint JNICALL JNI_CreateJavaVM(JavaVM **, void **, void *);

预处理后大概是这样的:

__declspec(dllimport) jint __stdcall
JNI_CreateJavaVM(JavaVM **, void **, void *);

现在mingw自带的gnu链接器可以直接使用.a、msvc的COFF格式.lib.dll中的符号。在您的原始命令中,它仅在提供的搜索路径 (-L ...) 中找到 jvm.dll,因此它尝试使用它。

问题是在 jvm.dll导出表中,JNI_CreateJavaVM 函数未修饰,所以它看起来像一个 cdecl 函数.此名称与链接器期望的名称不匹配,因此您会收到 undefined reference 错误。

从 Java Dev Kit 的角度来看,它在 jdk1.7.0_21\lib\jvm.lib 中包含一个导入库,它具有此符号的正确名称修饰。您修改后的命令有效,因为通过将 -L jdk1.7.0_21\lib 添加到搜索路径,它现在链接到 jvm.lib 而不是 jvm.dll.

关于c++ - 对 `JNI_CreateJavaVM' 窗口的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16930567/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com