所以我正在尝试使用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解决方案,我试图避免在运行时加载库。感谢
答案 0 :(得分:0)
听起来你错过了一个图书馆。如果您正在使用gcc检查所有-l
。如果您使用的是VS,请检查Config-> Linker-> Input下的“附加Dependancies”选项。
同时检查您是否拥有必要库的x86_64版本。
答案 1 :(得分:0)
在我看到的所有示例中,他们通过永远不会直接调用该函数来避免这个问题,因此它永远不必链接,因此没有错误。诀窍是在运行时查找函数并通过函数指针调用。以下是如何在Windows上执行此操作。不知道在其他操作系统上执行此操作的语法。
[免责声明 - 我从多个函数中复制/粘贴了代码,可能引入了编译器错误。这可能会也可能不会编译,但它应该让你开始]
首先为指向函数的指针创建自己的typedef
typedef jint (JNICALL* JvmCreateProcTypeDef)(JavaVM **, void **, void);
使用LoadLibrary查找JVM dll。由您的应用程序决定在哪里可以找到JVM DLL。在我们的例子中,我们分发了第三方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时处理运行时错误:)
希望这有帮助!