Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JNI4NET-如何从C#类库项目运行Java应用程序?_C#_Java Native Interface_Jni4net - Fatal编程技术网

JNI4NET-如何从C#类库项目运行Java应用程序?

JNI4NET-如何从C#类库项目运行Java应用程序?,c#,java-native-interface,jni4net,C#,Java Native Interface,Jni4net,我有Java swing应用程序,我想从C#运行它 当我从WindowsFormsApplication使用它时,它可以正常工作(请参阅下面的工作版本)。我将WindowsFormsApplication窗口设置为不可见,调用System.exit(0)后应用程序退出在Java中。但当我尝试使用ClassLibrary项目运行相同的程序时,我无法调用Application.run(),因此程序立即退出。 (在使用断点的调试模式下,我可以看到带有GUI的Java程序正确初始化并开始运行)。如何让它

我有Java swing应用程序,我想从C#运行它

当我从WindowsFormsApplication使用它时,它可以正常工作(请参阅下面的工作版本)。我将WindowsFormsApplication窗口设置为不可见,调用
System.exit(0)后应用程序退出在Java中。但当我尝试使用ClassLibrary项目运行相同的程序时,我无法调用
Application.run(),因此程序立即退出。
(在使用断点的调试模式下,我可以看到带有GUI的Java程序正确初始化并开始运行)。如何让它等待Java程序退出

使用WindowsFormsApplication的工作示例:

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

using java.io;
using java.lang;
using java.util;
using net.sf.jni4net;
using net.sf.jni4net.adaptors;

using tt_factory;

namespace BookMap
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string [] args)
        {
            Init();
            TT_Factory.create_replay(); // creates Java GUI
            Application.Run();
        }

        private static void Init()
        {
            BridgeSetup bridgeSetup = new BridgeSetup(true);
            bridgeSetup.AddJVMOption("-Xms900m");
            bridgeSetup.AddAllJarsClassPath(Application.StartupPath + "\\..\\lib");
            bridgeSetup.JavaHome = Application.StartupPath + "\\..\\jre";
            Bridge.CreateJVM(bridgeSetup);
            Bridge.RegisterAssembly(typeof(TT_Factory).Assembly);
        }
    }
}
更新:

我尝试启动新线程,但结果是一样的:程序立即退出

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(BookMap.create_replay));
            thread.Start();
            thread.Join();
        }
    }
}

这里有一个简单的解决方案。我还不知道怎么做,但程序会等到Java应用程序调用System.exit(0),然后退出Console.Read()

From:当您键入输入字符时,Read方法阻止其返回;当您按Enter键时,它终止

在这种情况下,没有人在控制台中按enter键

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            BookMap.create_replay();
            Console.Read();
        }
    }
}

你能解释一下为什么要从不能保证在用户上下文中运行的东西中调用交互式程序吗?我有一个完整的GUI应用程序,是用JavaSwing编写的。现在我想让它可以从C#访问,因为应用程序所需的一些数据源只有C#API。但它已经在WindowsFormsApplication中运行良好。我只是无法使用ClassLibrary项目使其运行。为了清楚起见,让我们重新编写我的问题:您有一个应用程序希望在基于用户的上下文中运行(有人登录到机器上,并将看到您希望显示的漂亮UI)-您想从一段不知道如何向客户机显示UI的代码开始所述UI——为什么您认为这是一件好事?是的,这是可能的(实际上相当简单),但很少有意义。您没有描述您期望该应用程序运行的环境,因此很难猜测它发生的原因——只需知道这是一个坏主意。我只希望C程序(类库或控制台应用程序)在Java运行之前一直运行。与使用WindowsFormsApplication时完全相同。我很乐意解释Java应用程序的作用,以及为什么我需要能够使用C#运行它,但我认为这可能是离题的,甚至被认为是升级。@Serg您的.Net应用程序应该创建一个对象,在Java UI完成时通知它,并执行WaitOne。Java代码完成后,对本机windows DLL进行JNI调用,该DLL由.Net应用程序加载,然后在先前创建的对象上触发Notify。Net应用程序随后将唤醒并终止。
namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            BookMap.create_replay();
            Console.Read();
        }
    }
}