4

我想编写一个调用 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 -version java version "1.7.0_17" Java(TM) SE Runtime Environment (build 1.7.0_17-b02) Java HotSpot(TM) 64-Bit Server 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();
    }
}
}
4

3 回答 3

5

我解决了错误:

unresolved external symbol _imp_JNI_CreateJavaVM@12 referenced

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

于 2014-05-30T11:56:10.357 回答
3

错误:

引用了未解析的外部符号_imp _JNI_CreateJavaVM @12

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

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

于 2013-09-10T09:14:29.240 回答
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 路径

于 2013-10-21T05:52:40.333 回答