JNI从C ++调用JavaGUI

时间:2015-08-25 13:55:58

标签: java c++ visual-studio java-native-interface

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

C ++代码如下所示:

#include <stdio.h>
#include <conio.h>

#include "C:\Program Files\Java\jdk1.8.0_51\include\jni.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:\EclipseProjects\SwingTest01\bin";
    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)创建了一个Header文件,并包含了jni.h和jni_md.h。另外,我在VS中添加了对我的项目的附加依赖项(在Properties-&gt; Linker-&gt; Input-&gt; Additional Dependencies中):

  

C:\ Program Files \ Java \ jdk1.8.0_51 \ lib

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

  

LNK1104无法打开文件'C:\ Program Files \ Java \ jdk1.8.0_51 \ lib.obj'

我不知道还包括什么或我做错了什么(该文件甚至不存在于该目录中)。

1 个答案:

答案 0 :(得分:0)

其他依赖应该是:

C:\Program Files\Java\jdk1.8.0_51\lib\jvm.lib