引用了未解析的外部符号 __imp__JNI_CreateJavaVM@12
Posted
技术标签:
【中文标题】引用了未解析的外部符号 __imp__JNI_CreateJavaVM@12【英文标题】:unresolved external symbol __imp__JNI_CreateJavaVM@12 referenced 【发布时间】:2013-09-13 22:00:53 【问题描述】:我想写一个调用Java方法的C++程序。
我正在尝试从 C++ 调用 Java 函数。如此处所述
http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/invocation.html
但我在调试时收到此错误,无法处理。 我正在使用 Visual Studio 2012。 这是我的代码 C++ 代码。
#include "stdafx.h"
#include <jni.h> /* where everything is defined */
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
JavaVM *jvm; /* denotes a Java VM */
JNIEnv *env; /* pointer to native method interface */
JavaVMInitArgs vm_args; /* JDK/JRE 6 VM initialization arguments */
JavaVMOption* options = new JavaVMOption[1];
options[0].optionString = "-Djava.class.path=C:\\Users\\yv\\workspace\\JNI\\bin"; // my class is under this directory.
vm_args.version = 0x00010006;
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.ignoreUnrecognized = false;
/* load and initialize a Java VM, return a JNI interface
* pointer in env */
JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args); // I got err msg "cannot convert parameter 2 from 'JNIEnv **' to 'void **' " so added (void **) as described in some other sources
delete options;
jvm->DestroyJavaVM();
return 0;
我的 comp 版本上安装的 Java 是 C:\Users\yv>JAVA-版本 java版本“1.7.0_17” Java(TM) SE 运行时环境 (build 1.7.0_17-b02) Java HotSpot(TM) 64 位服务器 VM(内部版本 23.7-b01,混合模式)
还有我的 java 代码以备不时之需。
public class jniClass
/**
* @param args
*/
public static void main(String[] args)
// TODO Auto-generated method stub
System.out.println("Hello, World!");
System.out.println("Arguments sent to this program:");
if (args.length == 0)
System.out.println("(None)");
else
for (int i=0; i<args.length; i++)
System.out.print(args[i] + " ");
System.out.println();
【问题讨论】:
【参考方案1】:我解决了错误:
unresolved external symbol _imp_JNI_CreateJavaVM@12 referenced
通过为应用程序配置安装正确版本的 JDK。我在 Windows 7(64 位)机器上安装了 64 位版本的 JDK。但是,我的应用程序是 32 位的。我卸载了 64 位 JDK 版本并安装了 32 位。之后就没有链接错误了。
【讨论】:
对我来说解决方案确实是这样,但不需要卸载 64 位版本,只需修复依赖路径以指向“x86”程序文件夹。【参考方案2】:错误:
未解析的外部符号_imp引用了_JNI_CreateJavaVM@12
是因为jni.lib
没有被链接:将它添加到要链接的库列表中(不确定在哪里,因为我不熟悉 VS IDE。@ 所在的路径987654322@ 文件所在的位置也需要指定)。
注意new[]
必须是delete[]
d,而不是delete
d(似乎没有理由动态分配内存)。
【讨论】:
1) 我应该将它添加到 Java 还是 C++ 程序中。 2) 我搜索了我的 C 盘,找不到任何 jni.lib 文件将其添加到要链接的库列表中。 @HorasanLee,将其添加到 C++ 中,将在$JAVA_HOME\lib
下。
任何地方都没有 jni.lib 文件。我卸载了 Java 1.7 并安装了 1.6,没有任何改变。周围没有 jni.lib 文件来指定路径。
hmjd 非常感谢您的回答和支持,但它是 "jvm.lib" 而不是 "jni.lib"。 【参考方案3】:
我解决了这个问题。 错误:
unresolved external symbol _imp_JNI_CreateJavaVM@12 referenced
是因为 jvm.lib 没有被链接。
可以通过两种方式解决。
使用 LoadLibrary 在运行时动态链接到 jvm.dll:
HINSTANCE hinstLib = LoadLibrary(TEXT("D:\\desired_jvm\\jre6\\bin\\client\\jvm.dll"));
typedef jint (JNICALL *PtrCreateJavaVM)(JavaVM **, void **, void *);
PtrCreateJavaVM ptrCreateJavaVM = (PtrCreateJavaVM)GetProcAddress(hinstLib,"JNI_CreateJavaVM");
jint res = ptrCreateJavaVM(&jvm, (void**)&env, &vm_args);
其次是将 jvm.lib 链接到您的项目。
右键单击项目-> 属性。
在属性对话框中
在 Linker->Input->AdditionalDependencies 区域下添加 jvm.lib。
并在Linker->General->AdditionalLibraryDirectories下写入jvm.lib路径
【讨论】:
我发现我的 jdk 安装 (java 1.6) 中有一个 jvm.lib,大约为 299k,而我的 jre 安装中有一个 jvm.lib,大约为 553k。当我与 jdk 库中的版本链接时,我得到了这个未解决的外部,当我使用 jre 中的库时,它链接没有错误。希望它可以帮助某人。 ^是的,是的。我爱你。 :)以上是关于引用了未解析的外部符号 __imp__JNI_CreateJavaVM@12的主要内容,如果未能解决你的问题,请参考以下文章
glCubicRayCast.obj : error LNK2019: 无法解析的外部符号 __imp__glewInit,该符号在函数 _main中被引用
错误 1 error LNK2019: 无法解析的外部符号 __imp__pthread_create,该符号在函数 _main 中被引用 解决方法
error LNK2019: 无法解析的外部符号 __imp_recv,该符号在函数 evthread_notify_drain_default 中被引用
qtmaind.lib(qtmain_win.obj) : error LNK2019: 无法解析的外部符号 __imp_CommandLineToArgvW,该符号在函数 WinMain 中被引用