Jna ¬¬

6 respostas
sephil

e ai pessoal!

eu preciso fazer a chamada de uma dll, blz, ja ta carregando a dll, mas nao consigo utilizar os metodos… a dll foi feita em C e eu nao tenho o codigo dela, usei o PE Explorer e consegui isso:

//AdUtil01 1.0 Type Library
//Version: 1.0
ADUTIL01Lib;
GUID = {9EEDB4C5-604D-417D-B9E2-CB06261C8363};


//AdUtilCom Class
CoClass AdUtilCom;
GUID = {FF810990-E5D3-4357-A806-25472E40A718};

//IAdUtilCom Interface
Dispatch IAdUtilCom;
GUID = {F6D47BE0-FAF8-4776-917F-486A4CE6D204};
  function QueryInterface(riid: ^GUID; out ppvObj: ^^VOID); stdcall;
  function AddRef: UI4; stdcall;
  function Release: UI4; stdcall;
  function GetTypeInfoCount(out pctinfo: ^UINT); stdcall;
  function GetTypeInfo(itinfo: UINT; lcid: UI4; out pptinfo: ^^VOID); stdcall;
  function GetIDsOfNames(riid: ^GUID; rgszNames: ^^I1; cNames: UINT; lcid: UI4; out rgdispid: ^I4); stdcall;
  function Invoke(dispidMember: I4; riid: ^GUID; lcid: UI4; wFlags: UI2; pdispparams: ^DISPPARAMS; out pvarResult: ^Variant; out pexcepinfo: ^EXCEPINFO; out puArgErr: ^UINT); stdcall;
  //method OpenFile
  function OpenFile(fname: BSTR; fmode: BSTR): I4; stdcall;
  //method WriteSpl
  function WriteSpl(buffadr: I4): I4; stdcall;
  //method CloseFile
  function CloseFile: I4; stdcall;
  //method LoadFcb
  function LoadFcb(buffadr: I4): I4; stdcall;
  //method ReadBinFile
  function ReadBinFile(buffadr: I4; reclen: I4): I4; stdcall;
  //method ReadCfgFile
  function ReadCfgFile: I4; stdcall;
  //method GetCfgIp
  function GetCfgIp: BSTR; stdcall;
  //method GetCfgPort
  function GetCfgPort: BSTR; stdcall;
  //method GetCfgDpgm
  function GetCfgDpgm: BSTR; stdcall;
  //method GetCfgCmd
  function GetCfgCmd: BSTR; stdcall;
  //method GetCfgFcb
  function GetCfgFcb: BSTR; stdcall;
  //method GetCfgDir
  function GetCfgDir: BSTR; stdcall;
  //method ReadCard
  function ReadCard(buffadr: I4; sendlen: I4): I4; stdcall;
  //method GetNumCards
  function GetNumCards: I4; stdcall;

na hora que tento usar a ReadCfgFile, que le as configs do programa ele nao encontra a função… e dá essa excecão:

Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: Error looking up function 'ReadCfgFile': Não foi possível encontrar o procedimento especificado.

        at com.sun.jna.Function.<init>(Function.java:113)
        at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:219)
        at com.sun.jna.Library$Handler.invoke(Library.java:193)
        at $Proxy0.ReadCfgFile(Unknown Source)
        at adconnector.FiladoPower.<init>(FiladoPower.java:75)
        at adconnector.FiladoPower$4.run(FiladoPower.java:472)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)

não sei se ta certo mas minha interface ta assim:

import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;

/**
 *
 * @author leandro
 */
public interface AdUtilCom extends StdCallLibrary{
    public String ReadCfgFile();
    public String GetCfgIp();
    public String GetCfgPort();
    public String GetCfgDpgm();
    public String GetCfgCmd();
    public String GetCfgFcb();
    public String GetCfgDir();
    
    AdUtilCom INSTANCE = (AdUtilCom)
     Native.loadLibrary("AdUtil01", AdUtilCom.class);
    
}

alguem pode dar uma luz?

6 Respostas

T

Essa DLL precisa ser registrada (regsvr32 suadll.dll) , não?

Se esse é o caso, você não pode usar o JNA e sim o Jacob ( http://sourceforge.net/projects/jacob-project/ ).

sephil

ola thingol,
a dll ja está registrada, vou dar uma olhada no jacob tb…
mas preferia fazer com o jna msm… pq ja ta tudo montado…

sephil

esse jacob usa o JNI tb nao eh?
e pra usar jni precisa conhecer o codigo nativo…

sephil

eh tem razão thingol… vou ter q usar o jacob mesmo, é um .com
vlw

sephil

ops… na hora de importar a dll ele da o seguinte erro:

Unable to load DLL: jacobX86.1.14M6
Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\WINDOWS\system32\jacobX86.1.14M6.dll: Falha na inicialização do aplicativo devido a configuração incorreta. A reinstalação do aplicativo pode resolver o problema
        at java.lang.ClassLoader$NativeLibrary.load(Native Method)
        at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1751)
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1676)
        at java.lang.Runtime.loadLibrary0(Runtime.java:822)
        at java.lang.System.loadLibrary(System.java:993)
        at com.jacob.com.JacobLibraryLoader.loadJacobLibrary(JacobLibraryLoader.java:76)
        at com.jacob.com.JacobObject.<clinit>(JacobObject.java:107)
        at adconnector.library.AdUtilCom.main(AdUtilCom.java:21)
Java Result: 1

a dll já esta na pasta System32,
e ja tentei com o comando regsvr32 jacobX86.1.14M6.dll
e aparece uma mensagem assim: “Falha em loadlibrary(“jacobX86.1.14M6.dll”)- Falha na inicialização do aplicativo devido a configuração incorreta. A reinstalação do aplicativo pode resolver o problema.”

T

Não usei essa versão nova do Jacob; pode ser que alguma DLL que ele necessite (msvcrt.dll etc.) esteja faltando.

Criado 19 de dezembro de 2007
Ultima resposta 19 de dez. de 2007
Respostas 6
Participantes 2