我想编写一个调用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&gt; JAVA -version java版“1.7.0_17” Java(TM)SE运行时环境(版本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();
}
}
}
答案 0 :(得分:4)
我解决了错误:
unresolved external symbol _imp_JNI_CreateJavaVM@12 referenced
为应用程序配置安装正确版本的JDK。我在Windows 7(64位)计算机上安装了64位版本的JDK。但是,我的应用程序是32位。我卸载了64位JDK版本并安装了32位。之后没有链接错误。
答案 1 :(得分:3)
错误:
未解析的外部符号_ imp _JNI_CreateJavaVM @ 12引用
是因为jni.lib
没有链接:将它添加到要与链接的库列表中(不知道我在哪里,因为我不熟悉VS IDE。 jni.lib
文件驻留也需要在某处指定。
请注意,new[]
必须是delete[]
d,而不是delete
d(似乎没有理由动态分配内存)。
答案 2 :(得分: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链接到您的项目。
右键点击该项目 - &gt;属性。
在“属性”对话框中
在Linker-&gt; Input-&gt; AdditionalDependencies区域下添加jvm.lib。
在Linker-&gt; General-&gt; AdditionalLibraryDirectories
下编写jvm.lib路径