"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Introdução à API de Função Estrangeira e Memória (Projeto Panamá)

Introdução à API de Função Estrangeira e Memória (Projeto Panamá)

Publicado em 2024-08-06
Navegar:281

Introduction to the Foreign Function & Memory API (Project Panama)

Project Panama é uma iniciativa OpenJDK que visa melhorar a conexão entre Java e código nativo. Um de seus principais componentes é a API Foreign Function & Memory, que simplifica e aprimora a maneira como os aplicativos Java interagem com bibliotecas e memória nativas.

O que é API de Função Estrangeira e Memória?

A API Foreign Function & Memory permite que programas Java chamem funções nativas e gerenciem a memória nativa diretamente. Esta API fornece uma maneira mais segura e eficiente de executar operações que, de outra forma, exigiriam a Java Native Interface (JNI).

Benefícios da API de Função Estrangeira e Memória

  1. Segurança: A API inclui recursos de segurança para evitar erros comuns associados ao código nativo, como vazamentos de memória e buffer overflows.
  2. Desempenho: Ao permitir acesso direto a funções nativas e memória, a API pode melhorar significativamente o desempenho de aplicativos Java que precisam interagir com bibliotecas nativas.
  3. Simplicidade: A API simplifica o processo de chamada de código nativo em comparação com JNI, reduzindo o clichê e tornando o código mais fácil de manter.

Usando a API de Função Estrangeira e Memória

Aqui está um exemplo de como usar a API Foreign Function & Memory para chamar uma função nativa:

  1. Definir a assinatura da função nativa

Primeiro, você precisa definir a assinatura da função nativa que deseja chamar. Suponha que temos uma biblioteca C com a seguinte função:

// native.c
#include 

void sayHello() {
    printf("Hello from C!\n");
}
  1. Carregue a biblioteca nativa e chame a função
import jdk.incubator.foreign.*;

public class ForeignFunctionExample {
    public static void main(String[] args) {
        try (var session = MemorySession.openConfined()) {
            SymbolLookup lookup = SymbolLookup.loaderLookup();
            var sayHello = lookup.find("sayHello").orElseThrow();

            var sayHelloHandle = CLinker.getInstance().downcallHandle(
                sayHello,
                FunctionDescriptor.ofVoid()
            );

            sayHelloHandle.invokeExact();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }
}

Neste exemplo:

  • Usamos SymbolLookup para encontrar a função sayHello na biblioteca nativa carregada.
  • Criamos um identificador para a função usando CLinker.
  • Chamamos a função nativa usando o identificador.

Gerenciando memória nativa

A API Foreign Function & Memory também permite gerenciar a memória nativa com segurança. Aqui está um exemplo:

import jdk.incubator.foreign.*;

public class MemoryManagementExample {
    public static void main(String[] args) {
        try (var session = MemorySession.openConfined()) {
            MemorySegment segment = MemorySegment.allocateNative(100, session);

            MemoryAccess.setByteAtOffset(segment, 0, (byte) 42);
            byte value = MemoryAccess.getByteAtOffset(segment, 0);

            System.out.println("Value: "   value);
        }
    }
}

Neste exemplo:

  • Alocamos um bloco de memória nativa.
  • Escrevemos e lemos um byte da memória alocada.
  • A memória é desalocada automaticamente quando a sessão é fechada.

Conclusão

A API Foreign Function & Memory é uma adição poderosa ao ecossistema Java, fornecendo uma maneira mais segura, eficiente e fácil de interagir com código nativo e memória. Se você precisa chamar funções nativas ou gerenciar memória nativa, esta API abre novas possibilidades para aplicativos Java.

Declaração de lançamento Este artigo é reproduzido em: https://dev.to/adaumircosta/introduction-to-the-foreign-function-memory-api-project-panama-20c8?1 Se houver alguma infração, entre em contato com [email protected] para excluí -lo
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3