У меня есть простая библиотека классов 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.
Пожалуйста, помогитеменя! Что я делаю не так?
Обновление . Исследование проблемы показало следующее:
В приложении Java ошибка появляется в строке hw.print();
. Если вы закомментируете это, приложение запустится успешно.
Если в оболочке C ++ / CLI в файле CppClassLibrary1.cpp вы замените тело функции Java_HelloWorld_print
на строку std::cout << "Hello World From C++/CLI!";
приложение Java запустится успешно и выведет строку Hello World From C++/CLI!
.
Если вы создаете консольное приложение C #, добавьте в него библиотеку C # в качестве ссылок и добавьте в метод Main
методClass1 cls = new Class1(); cls.print();
код, приложение успешно запустится и напечатает строку Hello World From C#!
.