__imp__JNI_CreateJavaVM@12引用未解析的外部符号
unresolved external symbol __imp__JNI_CreateJavaVM@12 referenced
我想写一个调用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 -versionJava 版本 "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();
}
}
}
我解决了错误:
unresolved external symbol _imp_JNI_CreateJavaVM@12 referenced
通过为应用程序配置安装正确版本的 JDK。我在Windows 7(64位)机器上安装了64位版本的JDK。但是,我的应用程序是 32 位的。我卸载了 64 位 JDK 版本并安装了 32 位。之后没有链接错误。
错误:
引用未解析的外部符号 _imp_JNI_CreateJavaVM@12
是因为jni.lib
没有链接:将其添加到要链接的库列表中(不确定在哪里,因为我不熟悉VS IDE。jni.lib
文件所在的路径也需要在某处指定)。
请注意,new[]
必须delete[]
d,而不是 delete
d(似乎没有理由动态分配内存)。
我解决了这个问题。错误:
unresolved external symbol _imp_JNI_CreateJavaVM@12 referenced
是因为 jvm.lib 没有被链接。
它可以通过两种方式解决。
第一个链接到 jvm.dll在运行时动态地使用 LoadLibrary:
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->AdditionalLibraryDirectory下写入jvm.lib路径
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 未解析的外部符号_MsiLocateComponentW@12.
- 在C++中使用 gRPC 时未解析的外部符号
- LibPrivoxy: 未解析的外部符号 __declspec(dllimport) int __stdcall Sta
- 尝试从 XamlApplication 编译 C++/WinRT 空白应用程序时,我收到未解析的外部符号 winrt_make_*
- 我收到错误LNK2001:未解析的外部符号(C++代码)
- 可视抽象类 c++(错误 LNK 2001:未解析的外部符号)
- 如何摆脱C++中未解析的外部符号"private: static char"错误?
- 当 lib 已添加到其他依赖项时,如何在 VS 中调试未解析的外部符号错误
- 仅在少数方法(静态或共享库)中解析的外部符号
- 未解析的外部符号"__declspec(dllimport)与 Spdlog c++ 库
- 函数 _main (OPENGL C++) 中引用的未解析的外部符号 ________
- 错误LNK2019未解析的外部符号"public: __thiscall SLinkList<char>::SLinkList<char>(void)"
- 使用静态 constexpr 成员的未解析外部符号
- 引入参数化构造函数后显示 LNK 2019 未解析外部符号的代码错误
- Dlib LNK2001未解析的外部符号USER_ERROR__consistent_build_configurati
- 矛盾的未解决的外部符号+未使用的库与VS2017和FFMPEG 4
- 链接器错误:切换到unicode生成给出:未解析的外部符号WinMain
- 类模板上一个特定函数的未解析外部符号
- LNK2001:未解析的外部符号public:static类std::vector