Вызов библиотеки C # из приложения Java: процесс завершен из-за исключения StackOverflowException - PullRequest
0 голосов
/ 10 октября 2019

У меня есть простая библиотека классов C #, я обернул ее в библиотеку классов C ++ / CLI и загрузил ее в простое консольное приложение Java. Но когда я запускаю приложение Java, я получаю следующую ошибку:

Process is terminated due to StackOverflowException.

Process finished with exit code -1073741571 (0xC00000FD)

В моей библиотеке C # есть файл Class1.cs:

using System;

namespace CSharpClassLibrary1
{
  public class Class1
  {
    public Class1() { }

    public void Print()
    {
      Console.WriteLine("Hello World From C#!");
    }
  }
}

В моей оболочке C ++ / CLI есть два файла: HelloWorld.h и CppClassLibrary1.cpp.

HelloWorld.h:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
  /*
   * Class:     HelloWorld
   * Method:    print
   * Signature: ()V
   */
  JNIEXPORT void JNICALL Java_HelloWorld_print
  (JNIEnv*, jobject);

#ifdef __cplusplus
}
#endif
#endif

Я получил его, запустив в приложении Java команду следующей формы: javac -h <directory> -d <directory> <source files>.

CppClassLibrary1.cpp:

#include "pch.h"
#include "HelloWorld.h"

using namespace CSharpClassLibrary1;

JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv* env, jobject obj)
{
  Class1^ cls = gcnew Class1();
  cls->Print();
}

Я добавил CSharpClassLibrary1 как ссылку на оболочку C ++ / CLI.

Я добавил в настройку «Включить каталоги» следующие пути:

C:\Users\ns16\AppData\Local\JetBrains\Toolbox\apps\IDEA-C\ch-0\192.6817.14\jbr\include
C:\Users\ns16\AppData\Local\JetBrains\Toolbox\apps\IDEA-C\ch-0\192.6817.14\jbr\include\win32

В моем приложении Java есть файл HelloWorld.java:

public class HelloWorld {

    public native void print();

    static {
        try {
            System.loadLibrary("CppClassLibrary1");
        } catch (UnsatisfiedLinkError e) {
            System.err.println("Native code library failed to load.\n" + e);
        }
    }

    public static void main(String[] args) {
        HelloWorld hw = new HelloWorld();
        hw.print();
    }
}

Я указал путь к библиотеке CppClassLibrary1 в переменной java.library.path.

Пожалуйста, помогитеменя! Что я делаю не так?

Обновление . Исследование проблемы показало следующее:

  1. В приложении Java ошибка появляется в строке hw.print();. Если вы закомментируете это, приложение запустится успешно.

  2. Если в оболочке C ++ / CLI в файле CppClassLibrary1.cpp вы замените тело функции Java_HelloWorld_print на строку std::cout << "Hello World From C++/CLI!";приложение Java запустится успешно и выведет строку Hello World From C++/CLI!.

  3. Если вы создаете консольное приложение C #, добавьте в него библиотеку C # в качестве ссылок и добавьте в метод Main методClass1 cls = new Class1(); cls.print(); код, приложение успешно запустится и напечатает строку Hello World From C#!.

1 Ответ

0 голосов
/ 11 октября 2019

Я скопировал сборку библиотеки C # в каталог с файлом java.exe (в моей системе он находится в C:\Users\ns16\AppData\Local\JetBrains\Toolbox\apps\IDEA-C\ch-0\192.6817.14\jbr\bin), и теперь приложение Java работает! Я бы не хотел перемещать сборку из каталога проекта, но это единственное решение, которое я нашел.

...