JNI Call JavaGUI from C++

JNI Call JavaGUI from C++

本文关键字:C++ from JavaGUI Call JNI      更新时间:2023-10-16

我正在使用VS2015,我试图从c++托管java GUI应用程序,以便我可以在我的WPF应用程序(容器)中嵌入c++代码。所以我开始尝试JNI,但到目前为止还没有成功。你能告诉我,如果这个想法可以工作,什么错误在我的代码可以。我知道已经有一些关于这个话题的帖子,但是没有一个对我有帮助。

c++代码看起来像这样:
#include <stdio.h>
#include <conio.h>
#include "C:Program FilesJavajdk1.8.0_51includejni.h"
#include "ToolbarFrame2.h"
JNIEnv* create_vm() 
{
    JavaVM* jvm;
    JNIEnv* env;
    JavaVMInitArgs args;
    JavaVMOption options[1];
    args.version = JNI_VERSION_1_8;
    args.nOptions = 1;
    options[0].optionString = "-    Djava.class.path=
        d:EclipseProjectsSwingTest01bin";
    args.options = options;
    args.ignoreUnrecognized = JNI_TRUE;
    JNI_CreateJavaVM(&jvm, (void **)&env, &args);
    return env;
}
void invoke_class(JNIEnv* env) 
{
    jclass helloWorldClass;
    jmethodID mainMethod;

    helloWorldClass = env->FindClass("ToolbarFrame2");
    mainMethod = env->GetStaticMethodID(helloWorldClass, 
    "main", "([Ljava/lang/String;)V");
    env->CallStaticVoidMethod(helloWorldClass, mainMethod);
}
int main(int argc, char **argv) 
{
    JNIEnv* env = create_vm();
    invoke_class(env);
}

这是java类:

public class ToolbarFrame2 extends JFrame {
public ToolbarFrame2() {
    initUI();
}
private void initUI() {
    JButton quitButton = new JButton("Quit");
    quitButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent event) {
            System.exit(0);
        }
    });
    this.createLayout(quitButton);
    setTitle("Simple example");
    setSize(300, 200);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
}
private void createLayout(JComponent... arg) {
    Container pane = getContentPane();
    GroupLayout gl = new GroupLayout(pane);
    pane.setLayout(gl);
    gl.setAutoCreateContainerGaps(true);
    gl.setHorizontalGroup(gl.createSequentialGroup()
            .addComponent(arg[0])
    );
    gl.setVerticalGroup(gl.createSequentialGroup()
            .addComponent(arg[0])
    );
}
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            ToolbarFrame2 ex = new ToolbarFrame2();
            ex.setVisible(true);
        }
    });
}

}

我从我的JAVA程序(使用javah)中创建了一个头文件,并包括jni_h和jni_md.h。我还添加了一个额外的依赖到我的项目在VS(在属性->链接器->输入->额外的依赖):

C: Program Files Java jdk1.8.0_51 lib

但是当我尝试编译我的c++代码时,编译时会抛出这个错误:

LNK1104无法打开"C:Program FilesJavajdk1.8.0_51lib"文件。obj '

我不知道还应该包括什么或者我做错了什么(而且这个文件甚至不存在于那个目录中)。

附加依赖项应该是:

C:Program FilesJavajdk1.8.0_51libjvm.lib