当前位置: 首页 > 知识库问答 >
问题:

未解析的外部符号\uu imp\uu JNI_CreateJavaVM@12引用的

荆城
2023-03-14

我想写一个调用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;
}

安装在my comp版本上的Java是C:\Users\yv

以及我的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();
    }
}
}

共有3个答案

唐兴贤
2023-03-14

我解决了这个问题。错误:

unresolved external symbol _imp_JNI_CreateJavaVM@12 referenced

是因为jvm。库未与链接。

可以通过两种方式解决。

到jvm的第一个链接。使用LoadLibrary在运行时动态创建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到您的项目。

右键单击该项目-

在“属性”对话框上

添加jvm。链接器下的库-

并在链接下写下jvm.lib路径-

宋涵忍
2023-03-14

错误:

未解析的外部符号_imp_JNI_CreateJavaVM@12引用

是因为jni。lib未被链接:将其添加到要链接的库列表中(不确定在何处,因为我不熟悉VS IDE。jni.lib文件所在的路径也需要在某处指定)。

请注意,新[]必须是删除[]d,而不是删除[](似乎没有理由动态分配内存)。

公孙宏畅
2023-03-14

我解决了错误:

unresolved external symbol _imp_JNI_CreateJavaVM@12 referenced

通过为应用程序配置安装正确版本的JDK。我在Windows 7(64位)机器上安装了64位版本的JDK。但是,我的应用程序是32位的。我卸载了64位JDK版本并安装了32位。之后没有链接错误。

 类似资料:
  • 首先,我知道这个问题在这个网站上到处都是,但是我看了几乎所有的问题,似乎找不到问题所在。这是在VS 2012中。谢谢。 这是插座。cpp公司 这是stdafx。h类 这是我的错误消息:

  • 我有一个cpp文件,其中包括: 当尝试运行AcquireCredentialsHandleW时,我得到.. MSDN说它在sspi.h中。

  • 我在我的MFC vtk项目中使用Visual Studio 2008。我收到一个链接错误,如下所示: vtkPBFEAView。obj:警告LNK4217:本地定义的符号?DrawDC@vtkMFCWindow@@QAEXPAVCDC@@@Z(public:void _thiscall vtkMFCWindow::DrawDC(类CDC*))在函数“protected:virtual void _

  • 如果在中发现未解析的外部符号,我必须做什么。库文件。如果我在中发现未解析的外部符号。c或。cpp我能修好它。但当我在里面发现了未解决的外部符号。lib(library)文件如何解决这个问题? 在我的例子中,我发现了如下链接器错误: 关于这一点的任何建议都将是有益的。

  • 我正在用c和visual studio进行我的第一次测试,我不知道为什么,当程序中没有出现“未解决的外部符号”时,我会遇到一个问题。 错误97错误LNK2001:未解析的外部符号"public:静态类会话*__cdecl会话::实例(无效)"(?Instance@Session@@SAPAV1@XZ)(...)\MyTest\Messages.objMyTest 错误98错误LNK2001:未解析

  • 当我运行下面的简单代码时,我有两个错误,如下所示: 错误: msvcrtd.lib(crtexew.obj):错误LNK2019:函数中引用了未解析的外部符号 我该怎么办?