TGViewer
Java Geek Java Geek @java_geek · 2.37K subscribers
Post #454 552
🌉 Project Panama. Как вызвать C/C++ без боли?

Java долгое время жила в изоляции. Чтобы выйти за пределы JVM (вызвать функцию из OS, использовать библиотеку ML на C++ или графику на Rust), нам приходилось писать "клей" (glue code) на C.

Project Panama (Foreign Function & Memory API) меняет парадигму. Теперь Java умеет говорить с нативным кодом напрямую.

🗑 Что мы выбрасываем (JNI)

1. Больше не нужно писать ни строчки на C/C++.
2. Больше нет утилиты javah.
3. Больше нет риска, что Unsafe удалят и ваш код сломается.

✨ Как это работает (FFM API)

Допустим, мы хотим вызвать стандартную функцию strlen из библиотеки C, чтобы узнать длину строки.

Шаг 1. Находим библиотеку


Linker linker = Linker.nativeLinker();
SymbolLookup stdlib = linker.defaultLookup();

// Ищем адрес функции "strlen" в памяти процесса
MemorySegment strlenAddress = stdlib.find("strlen").orElseThrow();



Шаг 2. Описываем сигнатуру (Descriptor)
Мы говорим Java: "Эта функция принимает указатель (Адрес) и возвращает число (long)".


FunctionDescriptor descriptor = FunctionDescriptor.of(
ValueLayout.JAVA_LONG, // Возвращаемое значение
ValueLayout.ADDRESS // Аргумент (указатель на строку)
);

MethodHandle strlen = linker.downcallHandle(strlenAddress, descriptor);



Шаг 3. Выделяем память и вызываем
Самое интересное: мы аллоцируем память вне Java кучи (Off-heap) безопасным способом через Arena.


try (Arena arena = Arena.ofConfined()) {
// Превращаем Java String в C-строку (char*)
MemorySegment cString = arena.allocateFrom("Hello Panama!");

// Вызываем функцию C прямо из Java!
long length = (long) strlen.invoke(cString);

System.out.println(length); // 13
}
// Тут память автоматически очищается (как free() в C)



🤖 Killer Feature: jextract

Вы скажете: "Писать дескрипторы для каждой функции вручную? Это же муторно!"
И вы правы. Поэтому есть утилита jextract.

Вы просто "скармливаете" ей заголовочный файл .h:


jextract --output src -t org.example.opengl /usr/include/GL/gl.h



Она сама сгенерирует все Java-классы и методы. Вы просто пишете:


gl.glClear(gl.GL_COLOR_BUFFER_BIT());



Это выглядит и работает как обычный Java-код, но под капотом вызывает OpenGL напрямую.

🧠 Зачем это нужно?

1. AI и ML: TensorFlow, PyTorch, OpenCV - все они написаны на C++. Теперь Java может использовать их без тормозов JNI.
2. Базы данных: Драйверы могут работать напрямую с сетевым стеком OS (io_uring).
3. Rust: Вы можете написать критически важную логику на Rust, скомпилировать в библиотеку и использовать в Java.

🏆 Итог серии Modern Java

• Она запускается мгновенно (GraalVM).
• Она держит миллионы соединений (Virtual Threads).
• Она безопасна и лаконична (Records, Sealed Classes).
• Она открыта миру (Panama).

#ProjectPanama #FFM #Native #Performance

👉 @java_geek
  • 👍 4
  • ❤ 1
  • 🤯 1
More from @java_geek
  1. Sep 24, 2026Что такое стек-трейс? Стек-трейс (stack trace) представляет собой список вызовов методов в…
  2. Sep 17, 2026Как перебрать элементы LinkedList в обратном порядке, не используя медленный get(index)? Д…
  3. Sep 15, 2026Array vs ArrayList Выбор между Array (стандартным Java-массивом) и ArrayList зависит от сп…
  4. Sep 11, 2026Какова цель ключевого слова final, когда оно используется с переменной? Ключевое слово fin…
  5. Sep 9, 2026☕ Java Tip: Как работает var в Java С версии Java 10 появился ключевое слово var. Оно упро…
  6. Sep 7, 2026Что такое перегрузка методов в Java? Перегрузка методов — это мощный приём, который позвол…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →