Pronova Rockey2 + Java

Estou em um novo projeto que foi necessário implementar licença de software utilizando tokens usb. Um amigo me indicou os tokens da Pronova (pronova.com.br) por ser simples de implementar e relativamente seguros. A diferença é que ele usou .NET e meu projeto é em Java e em Java sempre tem uma pegadinha do malandro 🙂

Lá vai eu pegar o sample do java que vem no cd de instalação e fazer os testes no eclipse. Segui as instruções (sic) do arquivo leia-me e apanhei feito mala velha.

Sempre que executava, me retornava o erro: java.lang.unsatisfiedlinkerror ou não encontrava o pacote “rockey2”.

Usei o DJ Decompiler para saber qual era o pacote que estava na tal classe “JRockey2.class” e não tinha pacote nenhum definido. Setei o pacote como sendo rockey2 e passou a apresentar o erro de classe duplicada.

Depois de muitas tentativas, achei o JNA (Java Native Access) e meus problemas acabaram. Joguei fora a classe JRockey2 que vem no SDK e criei uma interface como mostra os exemplos na wiki do JNA apontando para a dll Rockey2 e não a JRockey2.

Vamos a solução:

1. Baixe o jna.jar e platform.jar em https://github.com/twall/jna#download

2. Inclua essas libs no seu classpath

3. Se ainda não colocou, coloque as dlls do SDK na pasta C:\WINDOWS\System32

4. Criei seu wrapper, o meu ficou assim:

package com.wordpress.tidoc.security;

import com.sun.jna.Library;
import com.sun.jna.Native;

public interface JRockey2 extends Library
{
	JRockey2 INSTANCE = (JRockey2) Native.loadLibrary("Rockey2", JRockey2.class);

    public int RY2_Find();

    public int RY2_Open(int i, int j, int ai[]);

    public void RY2_Close(int i);

    public int RY2_GenUID(int i, int ai[], byte abyte0[], int j);

    public int RY2_Read(int i, int j, byte abyte0[]);

    public int RY2_Write(int i, int j, byte abyte0[]);

    public static final int AUTO_MODE = 0;
    public static final int HID_MODE = -1;
    public static final int ROCKEY2_DISABLE_WRITE_PROTECT = 0;
    public static final int ROCKEY2_ENSABLE_WRITE_PROTECT = 1;
    public static final int RY2ERR_SUCCESS = 0;
    public static final int RY2ERR_NO_SUCH_DEVICE = 0xa0100001;
    public static final int RY2ERR_NOT_OPENED_DEVICE = 0xa0100002;
    public static final int RY2ERR_WRONG_UID = 0xa0100003;
    public static final int RY2ERR_WRONG_INDEX = 0xa0100004;
    public static final int RY2ERR_TOO_LONG_SEED = 0xa0100005;
    public static final int RY2ERR_WRITE_PROTECT = 0xa0100006;
    public static final int RY2ERR_OPEN_DEVICE = 0xa0100007;
    public static final int RY2ERR_READ_REPORT = 0xa0100008;
    public static final int RY2ERR_WRITE_REPORT = 0xa0100009;
    public static final int RY2ERR_SETUP_DI_GET_DEVICE_INTERFACE_DETAIL = 0xa010000a;
    public static final int RY2ERR_GET_ATTRIBUTES = 0xa010000b;
    public static final int RY2ERR_GET_PREPARSED_DATA = 0xa010000c;
    public static final int RY2ERR_GETCAPS = 0xa010000d;
    public static final int RY2ERR_FREE_PREPARSED_DATA = 0xa010000e;
    public static final int RY2ERR_FLUSH_QUEUE = 0xa010000f;
    public static final int RY2ERR_SETUP_DI_CLASS_DEVS = 0xa0100010;
    public static final int RY2ERR_GET_SERIAL = 0xa0100011;
    public static final int RY2ERR_GET_PRODUCT_STRING = 0xa0100012;
    public static final int RY2ERR_TOO_LONG_DEVICE_DETAIL = 0xa0100013;
    public static final int RY2ERR_UNKNOWN_DEVICE = 0xa0100020;
    public static final int RY2ERR_VERIFY = 0xa0100021;
    public static final int RY2ERR_UNKNOWN_ERROR = 0xa010ffff;
}

5. Por último, faça a chamada em seu código assim:

int iRetcode = JRockey2.INSTANCE.RY2_Find();

]

Para quem tiver afim de conhecer mais sobre o JNA: http://en.wikipedia.org/wiki/Java_Native_Access e http://twall.github.com/jna/3.5.1/javadoc/

Abrassss

Tomcat 6 – Falha ao inicializar serviço

Se ao tentar iniciar o tomcat 6 numa máquina com Windows XP você recebe o erro abaixo no log

=========================

[173 javajni.c] [error] Can’t create the specified module.
[764 prunsrv.c] [error] Failed creating java
D:\Programs\Java\jdk1.6.0\jre\bin\server\jvm.dll
[982 prunsrv.c] [error] ServiceStart returned 1

=========================

Basta copiar o arquivo msvcr71.dll da pasta bin do JRE ( JRE_HOME\bin\msvcr71.dll ) para a pasta windows ou para CATALINA_HOME\bin que seu problema estará resolvido.

Esse problema aconteceu comigo essa semana, duas máquinas com as mesmas versões de JRE, Tomcat e Windows mas apenas uma funcionava. E o mais engraçado é que a máquina que funcionava não tinha o arquivo msvcr71.dll nem na pasta Windows e muito menos na pasta bin do tomcat 😐 ????????

Mas por que isso acontece? … Só Deus e agora a Oracle sabem 🙂 – I Love PHP