powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JNA и dll написана на "С"
10 сообщений из 10, страница 1 из 1
JNA и dll написана на "С"
    #38941628
levon.d.g
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте коллеги,
Есть 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
JNA и dll написана на "С"
    #38941648
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
levon.d.g,

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



и сюда
...
Рейтинг: 0 / 0
JNA и dll написана на "С"
    #38941797
levon.d.g
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
JNA и dll написана на "С"
    #38943146
levon.d.g
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Заметил если убрать из класса массивы то ошибка исчезает!
т.е. оставить только вот так:

Код: 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
JNA и dll написана на "С"
    #38943197
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
JNA и dll написана на "С"
    #38944762
levon.d.g
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
JNA и dll написана на "С"
    #38944776
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
JNA и dll написана на "С"
    #38944783
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
только не забудь
Код: java
1.
Pointer nativeBuf = new Memory(4 + 4*1 + 4 + 4*64 + 4*64 + 64*4);


а цифирки проверь, я на глаз считал
...
Рейтинг: 0 / 0
JNA и dll написана на "С"
    #38948161
levon.d.g
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
JNA и dll написана на "С"
    #38967719
levon.d.g
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Получилось сделать вот так:

двумерный массив
Код: 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
10 сообщений из 10, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JNA и dll написана на "С"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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