Me: struggling to send a single text file from my Mac to my other Mac (running Debian) via Bluetooth 😩

Me: remembering this is what SFTP was designed to do—over the entire freakin’ internet 😅

#CrossPlatform #SFTP #SSH #FileSharing

[RETRO V.G. ADS] (US) Shark Tale (2004) (Cross Platform)

YouTube

I've been using this handy little app for a couple years now. It lets me access my iCloud stuff from my LinuxMint desktop computer. Just thought I'd share, because it's useful!

#iCloud #Linux #iCloudNotes #Connectivity #CrossPlatform

https://snapcraft.io/icloud-notes

Install iCloud Notes on Linux | Snap Store

Get the latest version of iCloud Notes for Linux - Linux Client for iCloud Notes

Snapcraft

Библиотека EMX Controls для Avalonia UI — Версия 1.3 — Январь 2026

Вчера мы выпустили крупное обновление библиотеки EMX Controls для Avalonia UI. О новых возможностях библиотеки, а также о нашей новой программе поддержки open-source проектов мы расскажем в этой статье.

https://habr.com/ru/companies/eremexru/articles/988314/

#avalonia #crossplatform #UI #windows #linux #net #eremex #eremexcontrols #emxcontrols

Библиотека EMX Controls для Avalonia UI — Версия 1.3 — Январь 2026

Друзья, от лица нашей команды EMX Controls и всей компании Эремекс поздравляем вас с прошедшими праздниками. Пусть наступивший новый год подарит вам творческих успехов и позитивное настроение. А мы...

Хабр

SheetAtlas v0.5.1 is out, packed with new features! this release deals with managing columns, through linking, filtering, and receiving warnings for title case and data type inconsistencies.

https://ghostintheshell-192.github.io/sheet-atlas/

#Excel #CSV #OpenSource #DataAnalysis #FOSS #CrossPlatform #DotNet

SheetAtlas - Search & Compare Excel Data

Free cross-platform tool to search across Excel files and compare matching rows. Available for Windows and Linux. Find data quickly, analyze differences. 100% offline.

Palmr is a #selfhosted #opensource file sharing system that's easy to use, setup, and provide file access through powerful, yet simple sharing features. It runs on #Linux and #Docker, and is available through the browser for #crossplatform functionality. https://youtu.be/GgBl4M78y3s
Palmr - Simple File Sharing that keeps your files off the big guys' cloud.

YouTube

Yoop – công cụ AirDrop mã nguồn mở siêu nhanh, hỗ trợ Windows, Linux, macOS. Chỉ cần 4 ký tự, không tài khoản, truyền file & đồng bộ clipboard trong mạng nội bộ, TLS 1.3 bảo mật, hỗ trợ CLI & giao diện web, resume, xác thực Ed25519. Cài đặt qua npm: npm install -g yoop. Thử ngay! #Yoop #OpenSource #AirDrop #CrossPlatform #Clipboard #MãNguồnMở #CôngCụ

https://www.reddit.com/r/opensource/comments/1qgvbgx/i_released_yoop_a_fully_open_source_and_very_fast/

Wayland's fragmented ecosystem demands protocol-aware development. Use core protocols, fallbacks, and test across composites like GNOME, KDE, and Sway. Protocols Table is key. #Wayland #Linux #CrossPlatform #UIDevelopment #ProtocolAwareness

https://saysomething.hashnode.dev/wayland-app-development-a-guide-to-portable-uis-in-a-fragmented-ecosystem

# Взаимодействие 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

How to Build Android Widgets with .NET MAUI - .NET Blog

Explore the steps to build Android widgets using .NET MAUI. Discover tips for managing complexity and older Android versions.

.NET Blog