Java 从visualc/C++;使用C++/CLI

Java 从visualc/C++;使用C++/CLI,java,c++-cli,java-native-interface,Java,C++ Cli,Java Native Interface,我在尝试编译VS C++/CLI(托管)项目时遇到“错误LNK1104:无法打开文件{path}\jvm.lib”。这非常简单,我的目标是在预先存在的Java libs中调用一些Java方法-下面是我正在使用的代码: // This is the main DLL file. #include "stdafx.h" #include <jni_md.h> #include <jni.h> #include "JBridge.h" #pragma once using

我在尝试编译VS C++/CLI(托管)项目时遇到“错误LNK1104:无法打开文件{path}\jvm.lib”。这非常简单,我的目标是在预先存在的Java libs中调用一些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;
    }
    };
}
//这是主DLL文件。
#包括“stdafx.h”
#包括
#包括
#包括“JBridge.h”
#布拉格语一次
使用名称空间系统;
命名空间JBridge
{
公共引用类JniBridge
{
//TODO:在此处添加此类的方法。
公众:
void HelloWorldTest()
{
系统::控制台::WrdLeIn(“来自管理C++的Hello Word”);
}
JNIEnv*创建虚拟机(JavaVM**jvm)
{
JNIEnv*env;
JavaVMInitArgs vm_args;
JavaVMOption选项;
//java源代码的路径
options.optionString=“-Djava.class.path=D:\\Java Src\\TestStruct”;
vm_args.version=JNI_version_1_6;//JDK version。这表示版本1.6
vm_args.nOptions=1;
vm_args.options=&options;
vm_args.ignoreunrecogned=0;
int ret=JNI_CreateJavaVM(jvm,(void**)&env和vm_args);
如果(ret<0)
printf(“\n无法启动JVM\n”);
返回环境;
}
};
}
我已验证该文件是否存在于路径位置,并已将其添加到包含目录和链接器属性页的项目属性中

更新 让jvm.lib链接得更精细一些

编译在生成过程中会导致以下错误:

错误1错误LNK2028:未解析的令牌(0A00000A)“外部”C“长\uuu stdcall JNI\u CreateJavaVM(struct JavaVM\u**,void**,void*)”(?JNI\u CreateJavaVM@$$J212YGJPAPAUJavaVM_@@PAPAXPAX@Z)在函数“struct JNIEnv_*uu cdecl create_vm(struct JavaVM_**)”中引用(?create_vm@$$FYAPAUJNIEnv_@@PAPAUJavaVM_**@Z)c:\Temp\CLRTest\JBridge\JBridge\JBridge.obj JBridge 错误2错误LNK2019:未解析的外部符号“extern”C“long”\uu stdcall JNI\u CreateJavaVM(struct JavaVM\u**,void**,void*)”(?JNI\u CreateJavaVM@@$$J212YGJPAPAUJavaVM_@@PAPAXPAX@Z)在函数“struct JNIEnv_*uu 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(“路径/到/JVM”)动态加载JVM;然后调用本机函数。

解决方法是使用LoadLibrary(“path/to/JVM”)动态加载JVM;然后调用本机函数。

顺便说一句-我试图在x64中运行它,这就是JVM…看起来它找不到JVM。如果使用env变量,是否将JAVA_设置为HOME?你把jvm从原来的位置移走了吗?@Jason没有移动位置,但我重新启动了,它不知怎么地消失了。很奇怪。但是仍然收到错误。您是否检查了所包含的头文件是否与jvm.lib的相同版本匹配?顺便说一句-我正在尝试在x64中运行此文件,这就是jvm…看起来它找不到jvm。如果使用env变量,是否将JAVA_设置为HOME?你把jvm从原来的位置移走了吗?@Jason没有移动位置,但我重新启动了,它不知怎么地消失了。很奇怪。但是仍然收到错误。您是否检查以确保包含的标题与jvm.lib的相同版本相匹配?我遇到了完全相同的问题-请添加一个指向小型工作示例应用程序的链接或一个指向内容更丰富的博客条目的链接。(或者亲自给我发电子邮件)我也在为同样的问题而挣扎——请添加一个链接到一个小的工作示例应用程序,或者一个链接到一个内容更加丰富的博客条目。(或亲自给我发电子邮件)