Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / JNA и dll написана на "С" / 10 сообщений из 10, страница 1 из 1
21.04.2015, 14:48
    #38941628
levon.d.g
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNA и dll написана на "С"
Здравствуйте коллеги,
Есть dll написана "С", в нём есть функция: int Deposit (int Handle, NOTESINFO *Notes)

Параметр NOTESINFO ( он OUT параметр ) имеет след структуру:
typedef struct NOTESINFO
{
long amount;
char currency[4];
long counter;
long totPieces[64];
long denomination[64];
char code[64][4];
}

Написал класс:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
package mc; 

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

public class testapi{
  private iSibcash sibcash=(iSibcash)Native.loadLibrary("sibcash",iSibcash.class);  
  public interface iSibcash extends Library{        
    int Deposit(int Handle, NOTESINFO PNote);
  }
  
  private int Deposit(int Handle, NOTESINFO PNote){return sibcash.Deposit(Handle, PNote);}
 
  public static void main(String[] args) throws InterruptedException{
  try{
    testapi TestApi = new testapi();
    NOTESINFO PNote = new NOTESINFO();
    System.out.println("Deposit: "+TestApi.Deposit(1, PNote));
    }catch (Exception e) {System.out.println(e);};
  }
}


и класс:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
package mc;

public class NOTESINFO {
    int amount;
    char[] currency = new char[4];
    int counter;
    int[] totPieces = new int[64];
    int[] denomination = new int[64];
    char[][] code = new char[64][4];
}


При выполнении выдаёт ошибку:
java.lang.IllegalArgumentException: Unsupported argument type mc.NOTESINFO at parameter 1 of function Deposit

Помогите пожалуйста как решить этот вопрос!!!

P.S.
На Delphi код такой работает всё корректно:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
unit main;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Forms,
  Dialogs, StdCtrls, Controls, Grids;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type
   NOTESINFO = record
	amount:Integer;
        currency:array[1..4] of char;
    	counter:Integer;
    	totPieces:array[1..64] of Integer;
    	denomination:array[1..64] of Integer;
    	code:array[1..64, 1..4] of Char;
   end;
implementation
{$R *.dfm}

Function Deposit(Handle:Integer; var PNote:NOTESINFO): Integer; stdcall; external 'sibcash.dll' name 'Deposit';

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
PNoteF:NOTESINFO;
begin
i:=Deposit(1, PNoteF);
ShowMessage(IntToStr(i));
ShowMessage('amount' + IntToStr(PNoteF.amount));
end;
end.
...
Рейтинг: 0 / 0
21.04.2015, 15:03
    #38941648
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNA и dll написана на "С"
levon.d.g,

смотри
Код: java
1.
2.
3.
com.sun.jna.Pointer
com.sun.jna.Structure
com.sun.jna.Structure.ByReference



и сюда
...
Рейтинг: 0 / 0
21.04.2015, 16:57
    #38941797
levon.d.g
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNA и dll написана на "С"
am_sasa,

Написал вот так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
package mc; 
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Structure;
import java.util.Arrays;
import java.util.List;
public class testapi{

    public interface CLibrary extends Library {
            public static class notesinfo extends Structure {
            public static class ByReference extends notesinfo implements Structure.ByReference { }
                                             public long amount;
                                             public  char[] currency = new char[4];
                                             public  long counter;
                                             public  long[] totPieces = new long[64];
                                             public  long[] denomination = new long[64];
                                             public  char[][] code = new char[64][4];
                                             protected List getFieldOrder() {
                                                 return Arrays.asList(new String[]{"amount", "currency", "counter", "totPieces", "denomination", "code"});
                                            }
        }
                   public int Deposit(int Handle, notesinfo.ByReference PNote);
    }
    
  public static void main(String[] args) throws InterruptedException{
  try{
        CLibrary clib = (CLibrary)Native.loadLibrary("sibcash", CLibrary.class);
        CLibrary.notesinfo.ByReference PNote = new CLibrary.notesinfo.ByReference();
        int result = clib.Deposit(1,PNote);
        System.out.println("Result: "  + result);
    }catch (Exception e) {System.out.println(e);};
  }
}



Выходит ошибка:
java.lang.NullPointerException
Process exited with exit code 0.

что я делаю не так? вроде всё правильно!
...
Рейтинг: 0 / 0
23.04.2015, 08:26
    #38943146
levon.d.g
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNA и dll написана на "С"
Заметил если убрать из класса массивы то ошибка исчезает!
т.е. оставить только вот так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
package mc; 
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Structure;
import java.util.Arrays;
import java.util.List;
public class testapi{

    public interface CLibrary extends Library {
            public static class notesinfo extends Structure {
            public static class ByReference extends notesinfo implements Structure.ByReference { }
                                             public long amount;
                                             //public  char[] currency = new char[4];
                                             public  long counter;
                                             //public  long[] totPieces = new long[64];
                                             //public  long[] denomination = new long[64];
                                             //public  char[][] code = new char[64][4];
                                             protected List getFieldOrder() {
                                             return Arrays.asList(new String[]{"amount", /*"currency",*/ "counter"/*, "totPieces", "denomination", "code"*/});
                                            }
        }
                   public int Deposit(int Handle, notesinfo.ByReference PNote);
    }
    
  public static void main(String[] args) throws InterruptedException{
  try{
        CLibrary clib = (CLibrary)Native.loadLibrary("sibcash", CLibrary.class);
        CLibrary.notesinfo.ByReference PNote = new CLibrary.notesinfo.ByReference();
        int result = clib.Deposit(1,PNote);
        System.out.println("Result: "  + result);
    }catch (Exception e) {System.out.println(e);};
  }
}
...
Рейтинг: 0 / 0
23.04.2015, 09:34
    #38943197
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNA и dll написана на "С"
levon.d.g,

если вместо массивов заведешь переменные, то все будет работать, типа...
Код: java
1.
2.
3.
4.
5.
//public  char[] currency = new char[4];
public  char currency1;
public  char currency2;
public  char currency3;
public  char currency4;
...
Рейтинг: 0 / 0
24.04.2015, 15:49
    #38944762
levon.d.g
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNA и dll написана на "С"
am_sasa,

Написал вот так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
package mc; 
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Structure;
import java.util.Arrays;
import java.util.List;
public class testapi{

    public interface CLibrary extends Library {
            public static class notesinfo extends Structure {
            public static class ByReference extends notesinfo implements Structure.ByReference { }
                                             public long amount;
                                             public  char currency;
                                             public  long counter;
                                             public  long totPieces;
                                             public  long denomination;
                                             public  char code;
                                             protected List getFieldOrder() {
                                             return Arrays.asList(new String[]{"amount", "currency", "counter", "totPieces", "denomination", "code"});
                                            }
        }
                   public int Deposit(int Handle, notesinfo.ByReference PNote);
    }
    
  public static void main(String[] args) throws InterruptedException{
  try{
        CLibrary clib = (CLibrary)Native.loadLibrary("sibcash", CLibrary.class);
        CLibrary.notesinfo.ByReference PNote = new CLibrary.notesinfo.ByReference();
        int result = clib.Deposit(1,PNote);
        System.out.println("Result: "  + result);
    }catch (Exception e) {System.out.println(e);};
  }
}



Выдаёт ошибку:

Exception in thread "main" java.lang.Error: Invalid memory access
at com.sun.jna.Native.invokeInt(Native Method)
at com.sun.jna.Function.invoke(Function.java:383)
at com.sun.jna.Function.invoke(Function.java:315)
at com.sun.jna.Library$Handler.invoke(Library.java:212)
at com.sun.proxy.$Proxy0.Deposit(Unknown Source)
at mc.testapi.main(testapi.java:112)
Process exited with exit code 1.

Мозг скоро взорвётся, Помогите пожалуйста!!!!
...
Рейтинг: 0 / 0
24.04.2015, 16:02
    #38944776
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNA и dll написана на "С"
levon.d.g,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
typedef struct NOTESINFO
{
long amount;
char currency[4];
long counter;
long totPieces[64];
long denomination[64];
char code[64][4];
}


размер блока= 4 + 4*1 + 4 + 4*64 + 4*64 + 64*4
пока не напишешь структуру такого размера ничего не получится.

или попробуй
Код: java
1.
int Deposit(int Handle, Pointer PNote);


может получится, не уверен
...
Рейтинг: 0 / 0
24.04.2015, 16:09
    #38944783
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNA и dll написана на "С"
только не забудь
Код: java
1.
Pointer nativeBuf = new Memory(4 + 4*1 + 4 + 4*64 + 4*64 + 64*4);


а цифирки проверь, я на глаз считал
...
Рейтинг: 0 / 0
29.04.2015, 09:46
    #38948161
levon.d.g
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNA и dll написана на "С"
am_sasa,

Сделал вот так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
package mc; 
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import java.util.Arrays;
import java.util.List;

public class testapi{
   public interface CLibrary extends Library {
            public static class notesinfo extends Structure {
            public static class ByReference extends notesinfo implements Structure.ByReference {}

                                   public int amount;
                                   public Pointer currency;
                                   public int counter;
                                   public Pointer totPieces;
                                   public Pointer denomination;
                                   public Pointer code;
           @Override
            protected List getFieldOrder() {return Arrays.asList("amount", "currency", "counter", "totPieces", "denomination", "code");}
       }
                   public int Deposit(int Handle, notesinfo.ByReference PNote);
    }

  public static void main(String[] args) throws InterruptedException{
  try{

        CLibrary clib = (CLibrary)Native.loadLibrary("sibcash", CLibrary.class);
        CLibrary.notesinfo.ByReference PNote = new CLibrary.notesinfo.ByReference();
        System.out.println("Result Deposit: "  + clib.Deposit(1,PNote));
        System.out.println("Result amount: "  + PNote.amount);
        System.out.println("Result counter: "  + PNote.counter);

    }catch (Exception e) {System.out.println(e);};
  }
}



Заработало, но ответ иногда корректный:
Result Deposit: 1
Result amount: 0
Result counter: 0
Process exited with exit code 0.

а иногда "через раз" бывает вот так:
Result Deposit: 1
Result amount: 0
Result counter: 0
Process exited with exit code -1073740940.

из-за чего возникает такая ошибка?

P.S. На Delphi такой ошибки не возникает!
...
Рейтинг: 0 / 0
25.05.2015, 12:08
    #38967719
levon.d.g
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNA и dll написана на "С"
Получилось сделать вот так:

двумерный массив
Код: java
1.
public byte[][] code = new byte[64][4];

объявил вот так:
Код: java
1.
public byte[] code = new byte[256];



В итоге параметры все объявил вот так:

Код: java
1.
2.
3.
4.
5.
6.
           public int amount;
           public byte[] currency = new byte[4];
           public int counter;
           public int[] totPieces = new int[64];
           public int[] denomination = new int[64];
           public byte[] code = new byte[256];
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / JNA и dll написана на "С" / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]