Код: Выделить всё
#pragma once
#include
class Printer
{
public:
void print(const std::string& message);
};
< /code>
printer.cpp
#include "Printer.h"
void Printer::print(const std::string& message)
{
std::cout
printerwrapper.cpp
#include "Printer.h"
#include "PrinterWrapper.h"
extern "C" {
Printer* newPrinter()
{
return new Printer();
}
void Printer_print(Printer* printer, const char message[])
{
printer->print(message);
}
void deletePrinter(Printer* printer)
{
delete printer;
}
}
< /code>
printer.java
import java.lang.foreign.Arena;
import java.lang.foreign.FunctionDescriptor;
import java.lang.foreign.Linker;
import java.lang.foreign.MemorySegment;
import java.lang.foreign.SymbolLookup;
import java.lang.foreign.ValueLayout;
import java.lang.invoke.MethodHandle;
public class Printer {
private static final MethodHandle NEW_PRINTER;
private static final MethodHandle PRINTER_PRINT;
private static final MethodHandle DELETE_PRINTER;
private MemorySegment printerPointer;
static {
System.load("Path/to/shared/library");
Linker linker = Linker.nativeLinker();
SymbolLookup lookup = SymbolLookup.loaderLookup();
NEW_PRINTER = linker.downcallHandle(lookup.findOrThrow("newPrinter"),
FunctionDescriptor.of(ValueLayout.ADDRESS));
PRINTER_PRINT = linker.downcallHandle(lookup.findOrThrow("Printer_print"),
FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.ADDRESS));
DELETE_PRINTER = linker.downcallHandle(lookup.findOrThrow("deletePrinter"),
FunctionDescriptor.ofVoid(ValueLayout.ADDRESS));
}
public Printer() {
try {
printerPointer = (MemorySegment) NEW_PRINTER.invoke();
} catch (Throwable e) {
e.printStackTrace();
}
}
public void print(String message) {
try (Arena arena = Arena.ofConfined()) {
MemorySegment nativeString = arena.allocateFrom(message);
PRINTER_PRINT.invokeExact(printerPointer, nativeString);
} catch (Throwable e) {
e.printStackTrace();
}
}
public void delete() {
try {
DELETE_PRINTER.invokeExact(printerPointer);
} catch (Throwable e) {
e.printStackTrace();
}
}
}
< /code>
main.java
public class Main {
public static void main(String[] args) {
Printer printer = new Printer();
printer.print("Hello World!");
printer.delete();
}
}
< /code>
Если я запускаю программу, все работает нормально. Но вот неожиданное поведение: если я изменяю переменную PrinterPointer Код: Выделить всё
public Printer() {
printerPointer = MemorySegment.NULL;
}
< /code>
Второе изменение: < /p>
public Printer() {
printerPointer = MemorySegment.ofAddress(73928298);
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... h-pointers
Мобильная версия