尝试编译VS C ++ / CLI(托管)项目时,出现“错误LNK1104:无法打开文件{path} \ jvm.lib”。这很简单,我的目标是在预先存在的Java库中调用一些Java方法-这是我正在使用的代码:
// This is the main DLL file.
#include "stdafx.h"
#include <jni_md.h>
#include <jni.h>
#include "JBridge.h"
#pragma once
using namespace System;
namespace JBridge
{
public ref class JniBridge
{
// TODO: Add your methods for this class here.
public:
void HelloWorldTest()
{
System::Console::WriteLine("Hello Worldl from managed C++!");
}
JNIEnv* create_vm(JavaVM ** jvm)
{
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options;
//Path to the java source code
options.optionString = "-Djava.class.path=D:\\Java Src\\TestStruct";
vm_args.version = JNI_VERSION_1_6; //JDK version. This indicates version 1.6
vm_args.nOptions = 1;
vm_args.options = &options;
vm_args.ignoreUnrecognized = 0;
int ret = JNI_CreateJavaVM(jvm, (void**)&env, &vm_args);
if(ret < 0)
printf("\nUnable to Launch JVM\n");
return env;
}
};
}
我已验证该文件确实在路径位置中,并且已将其添加到include dir和linker属性页的项目属性中。
更新资料
得到了jvm.lib进行更多的链接。
编译在生成过程中导致以下错误:
错误1错误LNK2028:无法解析的令牌(0A00000A)“外部“ C”长__stdcall JNI_CreateJavaVM(struct JavaVM_ * *,void * *,void *)“(?JNI_CreateJavaVM @@ $$ J212YGJPAPAUJavaVM _ @@@ PAPAXPAX @ Z) struct JNIEnv_ * __cdecl create_vm(struct JavaVM_ * *)“(?create_vm @@ $$ FYAPAUJNIEnv _ @@ PAPAUJavaVM _ @@@@ Z)c:\ Temp \ CLRTest \ JBridge \ JBridge \ JBridge.obj JBridge
错误2错误LNK2019:未解析的外部符号“外部“ C”长__stdcall JNI_CreateJavaVM(struct JavaVM_ * *,void * *,void *)“(?JNI_CreateJavaVM @@ $$ J212YGJPAPAUJavaVM _ @@@ PAPAXPAX @ Z)在函数” struct JNIEnv_ * __cdecl create_vm(struct JavaVM_ * *)“(?create_vm @@ $$ FYAPAUJNIEnv _ @@ PAPAUJavaVM _ @@@@ Z)c:\ Temp \ CLRTest \ JBridge \ JBridge \ JBridge.obj JBridge
错误3错误LNK1120:2无法解析的外部文件c:\ temp \ CLRTest \ JBridge \ Debug \ JBridge.dll JBridge
最佳答案
解决方法是通过使用LoadLibrary(“ path / to / jvm”)动态加载JVM。然后调用本机函数。
关于java - 使用C++/CLI从Visual C/C++调用Java方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9999913/