0

所以我正在尝试使用 JNI 在 C++ 中调用我的 Java 类,并且在我尝试运行它之前一切看起来都很好。在 Xcode 我得到错误

Undefined symbols for architecture x86_64: "_JNI_CreateJavaVM", referenced from:

我认为这与架构有关,但不知道如何解决这个问题,有什么帮助吗?

我用来初始化 Java VM 的代码是

JNI_CreateJavaVM(&internal::gJVM, 
(void**)&internal::gEnv, &vm_args);

我在mac上,如果您有任何想法,请发布mac解决方案,我试图避免在运行时加载库。谢谢

4

2 回答 2

0

这听起来像你错过了一个图书馆。如果您使用 gcc,请检查您所有-l的 . 如果您使用的是 VS,请检查 Config->Linker->Input 下的“Additional Dependancies”选项。

还要检查您是否拥有必要库的 x86_64 版本。

于 2012-10-07T21:17:03.197 回答
0

在我看到的所有示例中,它们通过从不直接调用该函数来避免问题,因此它永远不必链接,因此没有错误。诀窍是在运行时查找函数并通过函数指针调用。这是在 Windows 上执行此操作的方法。不知道在其他操作系统上执行此操作的语法。

[免责声明 - 我从几个函数中复制/粘贴了代码,并且可能引入了编译器错误。这可能会或可能不会编译,但它应该让你开始]

首先为指向函数的指针创建自己的 typedef

typedef jint (JNICALL* JvmCreateProcTypeDef)(JavaVM **, void **, void);

使用LoadLibrary查找 JVM dll 。由您的应用程序决定在哪里可以找到 JVM DLL。在我们的例子中,我们分发了第 3 方 JRE,并且知道在哪里可以找到 DLL。

HMODULE jvmDll = LoadLibrary(jvmDllPath);

接下来使用GetProcAddress从 JVM dll 中查找函数的地址

JvmCreateProcTypeDef jvmCreateProc = (JvmCreateProcTypeDef) GetProcAddress(jvmDll,"JNI_CreateJavaVM");

现在将直接调用该函数的代码替换为以下通过函数指针调用它的代码:

jvmCreateProc(&internal::gJVM, (void**)&internal::gEnv, &vm_args);

这应该可以让您通过所有编译链接错误。现在您所要做的就是在您的代码找不到 DLL 时处理运行时错误 :)

希望这可以帮助!

于 2012-10-07T21:57:42.217 回答