Pergunta

A primeira dificuldade em usar JNA com J9 é que a JVM J9 não inclui o pacote java.awt e a classe Native importa algumas classes deste pacote.Isso é facilmente superado baixando o código-fonte JNA, removendo essas importações e seus métodos dependentes (que não estou usando de qualquer maneira) e construindo um novo jar JNA.

Aqui está um programa de teste simples:

    public class TestJni {
        public static void main(String[] args) {
            CLibrary instance = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);     
            instance.printf("Hello, World\n", new Object[] {});
        }

        // This is the standard, stable way of mapping, which supports extensive
        // customization and mapping of Java to native types.
        public interface CLibrary extends Library {        
            void printf(String format, Object[] args);
        }
    }

Depois de corrigir o problema java.awt, recebo o erro:

Caused by: java.lang.UnsatisfiedLinkError: C:\DOCUME~1\TSO0112\LOCALS~1\Temp\jna72681.dll (Incompatible JNI version (not 1.1, 1.2 or 1.4))
at java.lang.ClassLoader.loadLibraryWithPath(ClassLoader.java:973)
at java.lang.System.load(System.java:459)
at com.sun.jna.Native.loadNativeLibraryFromJar(Native.java:696)
at com.sun.jna.Native.loadNativeLibrary(Native.java:620)
at com.sun.jna.Native.<clinit>(Native.java:104)
at java.lang.J9VMInternals.initializeImpl(Native Method)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:187)
at TestJni.main(TestJni.java:8)

O que significa "versão JNI incompatível"?Alguém aí conseguiu que o J9 fosse legal com o JNA?

ATUALIZAR:Acho que o JNA está suprimindo o seguinte NoClassDefFoundError ao tentar carregar a classe java.nio.Buffer porque o J9 aparentemente não possui o pacote NIO incluído:

JNA: Problems loading core IDs: java.nio.Buffer
Exception in thread "main" java.lang.NoClassDefFoundError: java.nio.Buffer
    at java.lang.ClassLoader.loadLibraryWithPath(Native Method)
    at java.lang.ClassLoader.loadLibraryWithPath(ClassLoader.java:965)
    at java.lang.System.load(System.java:459)
    at TestJni.main(TestJni.java:8)
Foi útil?

Solução

Tenho trabalhado com JNA no j9 há alguns meses.Tive alguns pequenos problemas aqui e ali, mas a maioria das coisas parece funcionar bem.

Primeiro - As versões mais recentes do JNA (3.2.7) parecem importar o awt.Estou usando o 3.2.4 e as importações do awt estão comentadas.Acho que isso funcionará imediatamente para você.

Segundo - A versão do J9 com a qual estou trabalhando é para WinCE e é uma JVM para java 1.4.O JNA mais recente, porém, é construído a partir do Java 1.5.Portanto, você pode querer verificar em qual versão do Java sua versão do j9 foi construída.JNA 3.2.4 é compatível com java 1.4, eu acredito.

Outras dicas

Você também pode simplesmente fornecer suas próprias implementações de stub do material java.nio/java.awt e simplesmente evitar o uso desses recursos (principalmente material de buffer direto e obter um identificador para uma janela nativa).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top