Java 26 Is Here, And With It a Solid Foundation for the Future

Java 26 is here, and its main purpose seems to be to provide a solid foundation for future things to come. It comes with a few new features, some performance improvements and multiple enhancements that mention Project Valhalla as the inspiration for their existence. This post has all the info!

hanno.codes

# Взаимодействие Java и C/C++

#Java #C #Cplusplus #JNI #NativeCode #Programming #DevZone

6 min. reading
12 декабря 2017

Java, несмотря на некоторые «недостатки», является мощным и, что особенно важно, в большинстве случаев самодостаточным языком программирования. Под самодостаточностью я понимаю возможность писать программы, решающие конкретную задачу, без привлечения других языков программирования.

Однако я намеренно отметил, что самодостаточность Java проявляется именно в большинстве случаев. Иногда невозможно написать программу полностью, не используя вспомогательные инструменты. Например, может потребоваться код, обеспечивающий низкоуровневый доступ к «железу» компьютера, на котором выполняется программа. В языке Java, который изначально проектировался как кроссплатформенный, средства для низкоуровневого доступа к аппаратной части отсутствуют.

Для решения этой проблемы разработчики Java включили в язык возможность вызывать из Java-программ функции, реализованные на других языках программирования, через нативные методы. Подсистема Java, реализующая эту возможность, называется **JNI** (Java Native Interface — интерфейс Java для доступа к нативным методам).

Не так давно мне пришлось работать с одной Java-библиотекой. Проблема заключалась в том, что мне нужно было использовать методы, работающие с GPU (напишите в комментариях, если вам была бы интересна серия статей по CUDA), однако в Java-реализации библиотеки такой функциональности не было, и пришлось вызывать методы из программы на C. В этой статье мы поговорим о практическом применении #JNI.

## Создание класса

Для начала создадим класс, который будет содержать нативный метод.

```java
public class HelloJNI {
static {
System.loadLibrary("hello"); // Загрузка библиотеки hello.dll
}
// Объявление нативного метода sayHello(), без аргументов, возвращает void
private native void sayHello();
public static void main(String[] args) {
new HelloJNI().sayHello(); // вызов нативного метода
}
}
```

Мы объявили класс `HelloJNI`, содержащий нативный метод `sayHello`. Разберём код подробнее.

Блок `static` означает, что библиотека будет загружена во время загрузки класса. Чтобы программа смогла найти библиотеку, необходимо добавить путь к ней в `classpath`. Это можно сделать при запуске программы, добавив аргумент `-Djava.library.path=PATH_LIB`. Есть и другой вариант: вместо `loadLibrary` использовать `load`, но тогда придётся указывать полный путь к библиотеке (включая расширение `dll` или `so`).

На данном этапе у нас есть класс, но он никак не связан с библиотекой — самой библиотеки у нас пока нет.

## Создание библиотеки

Следующий шаг — компиляция файла и создание `h`-файла.

```bash
javac HelloJNI.java
javah HelloJNI
```

В результате мы получим следующий заголовочный файл:

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

#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloJNI
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
```

Что можно понять, глядя на этот файл? Во-первых, код на C будет подключать файл `jni.h`, который, к слову, содержит все необходимые функции для работы с JNI. Во-вторых, видно, что метод, описанный в классе `HelloJNI` как

```java
private native void sayHello();
```

в программе на C выглядит немного иначе:

```c
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *, jobject);
```

Как видно, функция принимает два аргумента, хотя мы их явно не указывали. Что это за аргументы?

* `JNIEnv*` — указатель на JNI-окружение, предоставляющее доступ ко всем функциям JNI;
* `jobject` — указатель на объект `this` в Java.

Определение `JNIEXPORT` в файле `jni_md.h`, который подключается из `jni.h`, выглядит так:

```c
#define JNIEXPORT __declspec(dllexport)
```

А `JNICALL` там же определяется следующим образом:

```c
#define JNICALL __stdcall
```

После этого становится понятно, что все эти «страшные» конструкции — всего лишь соглашения, используемые при вызове обычной экспортируемой функции.

## Реализация на C

Теперь реализуем описанную функцию в `c`-файле.

```c
#include <jni.h>
#include <stdio.h>
#include "HelloJNI.h"

JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {
printf("Hello World!\n");
return;
}
```

Как видно, функция выводит строку в консоль и возвращает `void`. *Главное — не забыть подключить заголовочный файл, созданный ранее.* Файл `jni.h` находится в каталогах `JAVA_HOME\\include` и `JAVA_HOME\\include\\win32`.

Теперь можно скомпилировать файл:

```bash
gcc -Wl --add-stdcall-alias -I"%JAVA_HOME%\\include" -I"%JAVA_HOME%\\include\\win32" -shared -o hello.dll HelloJNI.c
```

Поясним параметры:

* `-Wl --add-stdcall-alias` — опция, предотвращающая возникновение ошибки линковщика (`UnsatisfiedLinkError`);
* `-I` — дополнительные пути для включаемых заголовков (в нашем случае — `jni.h`);
* `-shared` — генерация динамической библиотеки;
* `-o` — имя выходного файла.

Теперь можно запустить Java-программу:

```bash
java HelloJNI
Hello World!
```

*Если вы использовали метод `loadLibrary`, запускать программу нужно так:*

```bash
java -Djava.library.path=PATH_TO_LIB HelloJNI
Hello World!
```

## Заключение

В статье были рассмотрены общие принципы использования JNI. С помощью этой технологии можно также вызывать методы классов, создавать новые объекты, передавать различные параметры (массивы, строки и т. д.), возвращать значения и многое другое. Подробнее можно прочитать [в официальной документации Oracle] и [в практическом руководстве Javamex].

Использование нативных методов в Java нарушает принцип кроссплатформенности языка. Программа, использующая DLL, становится жёстко привязанной к платформе, под которую реализована эта библиотека. Нативные методы оправданы в случаях, когда основная Java-программа должна работать на разных платформах, а нативные части планируется разрабатывать отдельно для каждой из них. Если же программа предполагается к использованию только на одной платформе, возникает логичный вопрос: зачем тогда вообще кроссплатформенность?

Ещё один недостаток — из нативного метода можно получить доступ практически к любой части системы, что противоречит идеологии Java, где одним из ключевых требований является безопасность.

Тем не менее, несмотря на все минусы, выбор технологий всегда остаётся за программистом.

#JNI #JavaDevelopment #NativeMethods #CrossPlatform #SystemProgramming

So sánh Eclipse Collections và JDK Collections:

1. Bộ nhớ: Eclipse Collections tối ưu hơn nhờ hỗ trợ kiểu dữ liệu nguyên thủy (primitive), giúp giảm tiêu thụ RAM đáng kể so với JDK Collections.
2. Hiệu năng: Khả năng xử lý song song và lặp nhanh hơn trong nhiều trường hợp thực tế.
3. API: Cung cấp bộ API phong phú (Immutable, Mutable, BiMap, Multimap) giúp code gọn gàng, dễ đọc hơn Java Streams truyền thống.

#Java #EclipseCollections #JDK #Programming #JavaDevelopment #LapTrinh #CongNghe

http

Applets Are Officially Gone, But Java In The Browser Is Better Than Ever

Applets Are Officially Gone, But Java In The Browser Is Better Than Ever

@openrewrite The truth? Most "6-month migrations" are 4-hour automations once you understand how LST structures and visitor patterns work together.
Join our next workshops: moderne.ai/moderne-openrewrite-training-hub
#OpenRewrite #CodeTransformation #RefactoringAtScale #JavaDevelopment #MigrationEngineering
3/3 🧵

Giải pháp BitDive cho Spring Boot: Tạo test tự động từ lỗi thực tế trên production. Giảm thời gian sửa test flaky, tăng độ tin cậy và dễ dàng tái hiện bug. Phản hồi từ cộng đồng Spring Boot được mong đợi! #SpringBoot #Testing #Automation #DevOps #JavaDevelopment #KiểmThửTựĐộng #PhátTriểnPhầnMềm

https://www.reddit.com/r/programming/comments/1nkfg4g/stop_babysitting_tests_in_spring_boot_turn_real/

(more Linux and FOSS news in previous posts of thread)

Apache NetBeans 27 released with Gradle 9 fixes, improved JDK 25 compatibility, Maven 3.9.11, improved refactoring for standalone files, improvements for code formatting and reindentation, etc.:
https://alternativeto.net/news/2025/8/apache-netbeans-27-released-with-gradle-9-fixes-improved-jdk-25-compatibility-and-more/

Microsoft's DocumentDB (PostgreSQL-based, MongoDB compatible document database) is now under the umbrella of the Linux Foundation:
https://news.itsfoss.com/documentdb-moves-to-linux-foundation/

QEMU 10.1 released with Intel TDX (Trust Domain Extensions) support, ARM, RISC-V and LoongArch improvements, etc.:
https://9to5linux.com/qemu-10-1-released-with-tdx-support-many-risc-v-and-arm-improvements

FreeBSD quarterly status report: bsd-user-4-linux (BSD user-mode emulation for QEMU on Linux), ability to install packages from pkg.freebsd.org in the system installer, Sylve (Proxmox-inspired, unified system management platform), Geomann (partition tool), work on suspend/resume and s0ix sleep support for laptops, porting Apple's HFS+ file-system:
https://www.phoronix.com/news/FreeBSD-Q2-2025-Status-Report

GhostBSD presents the new macOS-like Gershwin desktop environment, a successor to GNUstep, currently with Xorg support with plans for Wayland, using XFCE4-WM with plans for a custom WM:
https://www.phoronix.com/news/GhostBSD-Gershwin-Desktop

#WeeklyNews #OpenSource #FOSSNews #OpenSourceNews #FOSS #Apache #NetBeans #DocumentDB #QEMU #VirtualMachine #Virtualization #Database #DatabaseManagement #IDE #FreeBSD #GhostBSD #Gershwin #OperatingSystem #OS #DesktopEnvironment #BSD #Coding #Development #DBMS #CodeEditor #Programming #Java #JavaDev #JavaDevelopment #FosseryTech

Feeling the friction of getting Java apps cloud-ready? Spring Architects, it's time to smooth out those bumps with Quarkus! Achieve superior cloud-native performance, reduced resource consumption, and simplified deployments. Embrace Quarkus and accelerate your journey to the cloud. #CloudNative #JavaDevelopment #Spring

https://quarkus.io/spring/

OH: Moment, ich gibt dir die API-Keys aus dem Production Pod zum Testen.

#cloud #secretmanagement #APIKeys #javadevelopment