As bibliotecas nativas são arquivos de biblioteca específicos da plataforma, incluindo .dll, .so ou objetos
*SRVPGM, que podem ser configurados em bibliotecas compartilhadas.
Bibliotecas nativas estão visíveis para um carregador de classes de aplicativos sempre que a biblioteca compartilhada for associada a um aplicativo. De forma semelhante, as bibliotecas nativas estão visíveis para um carregador de classes do servidor de aplicativos sempre que a biblioteca compartilhada for associada a um servidor de aplicativos.
Antes de Iniciar
Ao projetar uma biblioteca compartilhada, considere as seguintes condições relativas ao suporte à biblioteca nativa Java:
- A JVM (Java Virtual Machine) permite somente um carregador de classes para carregar uma biblioteca nativa específica.
- Não há nenhuma API (Interface de Programação de Aplicativo) para descarregar uma biblioteca nativa de um carregador de classes.
As bibliotecas nativas são descarregadas pela JVM quando o carregador de classes que localizou a biblioteca é coletado do heap durante a coleta de lixo.
- Os carregadores de classes do servidor de aplicativos, diferentemente do carregador de classes JVM nativo, só carregam bibliotecas compartilhadas nativas que utilizam a extensão do sistema operacional padrão para a plataforma atual. Por exemplo, em AIX, as bibliotecas compartilhadas nativas devem terminar em .a quando carregadas por carregadores de classes do servidor de aplicativos. Os arquivos de cargas dos carregadores de classe JVM terminando em .a ou.so.
O Java Web Start pode carregar bibliotecas compartilhadas nativas
apenas com a extensão do arquivo .so. Renomeie quaisquer bibliotecas compartilhadas nativas de modo que elas tenham a extensão do arquivo .so antes de empacotá-las
em um arquivo Java archive (JAR) para implementação do Java Web Start.
- Os carregadores de classes do servidor de aplicativos persistem para a duração do servidor de aplicativos.
- Os carregadores de classes de aplicativos persistem até um aplicativo ser parado ou dinamicamente recarregado.
Se uma biblioteca compartilhada configurada com um caminho de biblioteca nativa for associado a um aplicativo, toda vez que o aplicativo for reiniciado ou recarregado dinamicamente, o aplicativo pode falhar com um UnsatisfiedLinkError, indicando que a biblioteca já está carregada. O erro ocorre porque, quando o aplicativo é reiniciado, ele chama a classe da biblioteca compartilhada para recarregar a biblioteca nativa. A biblioteca nativa, no entanto, ainda é carregada na memória, pois o carregador de classes de aplicativos que anteriormente carregou a biblioteca nativa não teve o lixo coletado ainda.
- Somente o carregador de classes da JVM pode carregar uma biblioteca nativa dependente.
Por exemplo, se
NativeLib1 depender de NativeLib2, então, NativeLib2 deve estar visível para o carregador de classes da JVM. O caminho que contém NativeLib2 deve ser especificado no caminho da biblioteca Java definido pela variável de ambiente LIBPATH.
A propriedade LIBPATH (java.library.path) é configurada usando a variável de ambiente process_name_region_libpath, como control_region_libpath, server_region_libpath,
ou adjunct_region_libpath. Para obter instruções sobre como definir as variáveis LIBPATH de região, consulte Alterando os Valores das Variáveis Referidas nas Mensagens BBOM0001I.
Se uma biblioteca nativa configurada em uma biblioteca compartilhada depender de outras bibliotecas nativas, as bibliotecas dependentes deverão ser configuradas no LIBPATH da JVM hosting do servidor de aplicativos para que a biblioteca seja carregada com êxito.
Sobre Esta Tarefa
Ao configurar uma biblioteca compartilhada em uma
página de configurações de biblioteca compartilhada, se você especificar um valor para
Caminho da biblioteca nativa, as bibliotecas nativas nesse caminho não serão localizadas pelo aplicativo
WebSphere Application Server, ou pelos carregadores de classes de biblioteca compartilhada, a menos que a classe que carrega a biblioteca nativa seja carregada pelo mesmo carregador de classes.
Como uma biblioteca nativa
não pode ser carregada mais de uma vez por um carregador de classes, é preferível que as bibliotecas nativas sejam carregadas em bibliotecas compartilhadas associadas ao carregador de classes de um servidor de aplicativos, pois esses carregadores de classes persistem pela existência do servidor.
Procedimento
- Implemente um método estático na classe que carrega a biblioteca nativa.
Na classe que carrega a biblioteca nativa, chame System.loadLibrary(native_library) em um bloco estático. Exemplo
static {System.loadLibrary("native_library");
native_library é carregada durante a inicialização estática da classe, que ocorre exatamente uma vez quando a classe é carregada.
- Na página de configurações da biblioteca compartilhada, defina valores para Caminho de classe e Caminho da biblioteca nativa que permitem que a biblioteca compartilhada carregue a biblioteca nativa.
Se desejar associar sua biblioteca compartilhada a um aplicativo ou módulo, selecione também Utilizar um carregador de classes isolado para essa biblioteca compartilhada. Se você não ativar essa configuração, associe a biblioteca compartilhada a um servidor de aplicativos.
- Associe a biblioteca compartilhada.
- Se você não ativou Utilizar um carregador de classes isolado para essa biblioteca compartilhada, associe a biblioteca compartilhada a um servidor de aplicativos.
A associação de uma biblioteca compartilhada ao carregador de classes de um servidor de aplicativos, em vez de a um aplicativo, assegura que a biblioteca compartilhada seja carregada exatamente uma vez pelo carregador de classes do servidor de aplicativos, apesar dos aplicativos do servidor serem reiniciados ou recarregados dinamicamente. Como a biblioteca nativa é carregada em um bloco estático, a biblioteca nativa nunca é carregada mais de uma vez.
- Se você ativar Utilizar um carregador de classes isolado para essa biblioteca compartilhada, associe a biblioteca compartilhada a um aplicativo ou módulo.
Associar um arquivo de biblioteca compartilhada isolado a um aplicativo ou módulo carregará as classes representadas pela biblioteca compartilhada em um carregador de classes separado criado para essa biblioteca compartilhada. Não associe um arquivo de biblioteca compartilhada isolado a um servidor se desejar
um carregador de classes separado para uma biblioteca compartilhada. Se você associar a biblioteca compartilhada a um servidor, o produto ignorará a configuração de isolamento e incluirá arquivos na biblioteca compartilhada no carregador de classes do servidor de aplicativos. Ou seja, associar um arquivo de biblioteca compartilhada isolado a um servidor associará o arquivo a todos os aplicativos no servidor.
O carregador de classes criado para uma biblioteca compartilhada isolada não é recarregado e, como um carregador de classes de servidor, existirá durante o tempo de vida de um servidor. Para as bibliotecas nativas compartilhadas, é possível utilizar uma biblioteca compartilhada isolada para evitar erros resultantes do recarregamento das bibliotecas nativas.
O que Fazer Depois
Para verificar se um aplicativo pode utilizar uma biblioteca compartilhada, teste o aplicativo ou examine o carregador de classes no Visualizador de carregador de classes.
Clique em . O caminho de classe do carregador de classes do módulo
aplicativo lista as classes utilizadas pela biblioteca compartilhada.