如何在C ++中使用JNI来使用Java类?

时间:2012-10-07 21:13:47

标签: java xcode architecture jvm java-native-interface

所以我正在尝试使用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解决方案,我试图避免在运行时加载库。感谢

2 个答案:

答案 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时处理运行时错误:)

希望这有帮助!