Вызов библиотеки, созданной с помощью .NET Native AOT, приводит к сбою при вызове из Java в Linux.JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Вызов библиотеки, созданной с помощью .NET Native AOT, приводит к сбою при вызове из Java в Linux.

Сообщение Anonymous »

У меня есть проект .NET 9, который публикуется как собственная библиотека AOT для Windows и Linux. Эта библиотека экспортирует некоторые методы, которые, в свою очередь, снова вызываются из Java через FFM из Windows или Linux. В целом это работает довольно хорошо. Собственная библиотека выполняет довольно сложные операции, и я могу без проблем использовать ее под Windows. В Linux это тоже работает, за исключением одной ошибки: после завершения программы я получаю ошибку сегмента от Java. Сами вызовы, кажется, работают хорошо, я получаю все ожидаемые результаты, и вызовы сам по себе, похоже, не вызывают ошибку, т. е. программа работает до конца и впоследствии вызывает ошибку сегмента.
Я могу воспроизвести это в специальной установке Debian 12 и в дистрибутиве Debian WSL2.
Я сократил это до абсолютно минимального примера без какой-либо логики, которая все еще воспроизводит это:

Код: Выделить всё

using System.Runtime.InteropServices;

namespace NativeTest
{
public class Class1
{
[UnmanagedCallersOnly(EntryPoint = "BasicTest")]
public static void BasicTest()
{
Console.WriteLine("Hello from native");
}
}
}
csproj:

Код: Выделить всё



net9.0
enable
enable
True
True
True
latest



Java:

Код: Выделить всё

import java.lang.foreign.*;
import java.lang.invoke.MethodHandle;

public class Main {

public static void main(String[] args) {
try (Arena arena = Arena.ofConfined()) {
Linker linker = Linker.nativeLinker();
SymbolLookup library = SymbolLookup.libraryLookup("./NativeTest.so", arena);

MethodHandle myMethod = linker.downcallHandle(library.find("BasicTest").orElseThrow(), FunctionDescriptor.ofVoid());

myMethod.invoke();

} catch (Throwable t) {
System.out.println("Error is " + t.getMessage());
}
}
}
Выполняется с использованием:

Код: Выделить всё

dotnet publish -r linux-x64 -c Debug
javac Main.java
java --enable-native-access=ALL-UNNAMED Main
Результаты:

Код: Выделить всё

Hello from native
[1]    815 segmentation fault (core dumped)  java --enable-native-access=ALL-UNNAMED Main
Версии:

Код: Выделить всё

# java --version
java 23.0.1 2024-10-15
Java(TM) SE Runtime Environment (build 23.0.1+11-39)
Java HotSpot(TM) 64-Bit Server VM (build 23.0.1+11-39, mixed mode, sharing)
# dotnet --version
9.0.101

Что мне здесь не хватает?

Подробнее здесь: https://stackoverflow.com/questions/793 ... alled-from
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»