Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / JNA возращаем char* / 8 сообщений из 8, страница 1 из 1
21.06.2013, 17:53:20
    #38306670
LeoArslan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNA возращаем char*
Добрый день.
Имеем описание функции в my_dll.dll
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
int my_function(char* param1, struct answer* ans);

#pragma pack(1)
struct answer{
  int TType;                   //IN
  unsigned long Amount;   //IN
  char          Rcode   [2+1];  //OUT
  char          AMessage[16 ]; //OUT
  int           CType;              //OUT
  char*         Check;            //OUT
};



На Java у меня такой код:
Код: 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.
  public interface My_Dll extends Library {
        public static class answer extends Structure {
                    public static class ByReference extends answer implements Structure.ByReference {}
                    
              public int  TType      = 0;                   
              public int  Amount     = 0;        
              public byte Rcode[]    = new byte[3]; //выход: 
              public byte AMessage[] = new byte[16]; //выход: 
              public int  CType      = 0;         //выход: 
              public Pointer Check;         //выход: 
              protected List getFieldOrder() {
                      return Arrays.asList(new String[] {"TType", "Amount", "Rcode","AMessage", "CType","Check"});
              }
        }
        public int my_function(byte track2[], answer.ByReference ans);
  }

  public static void Start() {
      My_Dll test_dll = (My_Dll) Native.loadLibrary("my_dll", My_Dll.class);
      My_Dll.answer.ByReference aa = new My_Dll.answer.ByReference();
      // определяем In
      aa.Amount = 100;
      aa.TType =3;

      int result = test_dll.my_function(null,aa);
      // выводим OUT
      System.out.println("Result: "  + result);
      System.out.println("Rcode: "  + new String(aa.Rcode));
      System.out.println("Amessage: " + new String(aa.AMessage));
}


Вопрос - как работать с Check и track2, которые имеют в dll тип char*. Кроме того Check заполняется функцией и содержит текст(500 и более символов). Как Check определить в структуре и получить от туда текст в нужной кодировке?
...
Рейтинг: 0 / 0
26.06.2013, 11:17:04
    #38310832
LeoArslan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNA возращаем char*
Не уже ли ни у кого нет идей :((??
...
Рейтинг: 0 / 0
26.06.2013, 21:53:13
    #38311938
dirt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNA возращаем char*
LeoArslan,
Обычно ещё дополнительный параметр используют для передачи количества байт.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
	// DWORD CreateSignCades (BYTE *pbData, int pcData, BYTE **pbSign, int* pcSign)
	public int CreateSignCades(byte[] pbData, int pcData, PointerByReference pbSign, IntByReference pcSign);
			
			
	// использование
	PointerByReference signature = new PointerByReference();
	IntByReference signatureSize = new IntByReference();
	int res = WinPKIcades.INST.CreateSignCades(data, data.length, signature, signatureSize);
	byte[] sign = signature.getValue().getByteArray(0, signatureSize.getValue());
...
Рейтинг: 0 / 0
27.06.2013, 12:27:42
    #38312402
LeoArslan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNA возращаем char*
Кол-во байт не указывается, но проблема возникает еще ранее:
Код: java
1.
2.
3.
PointerByReference Check = new PointerByReference(); 
...
Pointer p =  Check.getValue();



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Unexpected Signal : EXCEPTION_ACCESS_VIOLATION (0xc0000005) occurred at PC=0x2E863B1
Function=Java_com_sun_jna_Native__1getPointer+0x21
Library=C:\Documents and Settings\pra_2\Local Settings\Temp\jna-pra_2\jna30865.dll

Current Java thread:
	at com.sun.jna.Native._getPointer(Native Method)
	at com.sun.jna.Native.getPointer(Native.java:1776)
	at com.sun.jna.Pointer.getPointer(Pointer.java:664)
	at com.sun.jna.ptr.PointerByReference.getValue(PointerByReference.java:37)
	at test.JNATestClass.StartPinpad(JNATestClass.java:118)
	at test.JNATestClass.main(JNATestClass.java:167)

Dynamic libraries:
0x00400000 - 0x0040B000 	C:\soft\JDeveloper\jdk1.4\bin\javaw.exe
...
Рейтинг: 0 / 0
27.06.2013, 14:25:24
    #38312664
dirt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNA возращаем char*
вот тут "..." что находится?
Сам по себе код
Код: java
1.
2.
PointerByReference Check = new PointerByReference(); 
Pointer p =  Check.getValue();	


ошибок не вызовет, просто p = null будет.
...
Рейтинг: 0 / 0
27.06.2013, 16:06:59
    #38312895
LeoArslan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNA возращаем char*
Вызывает ошибку именно это место.
Что между этим было написано выше, т.е. получаем:
Код: 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.
 public interface My_Dll extends Library {
        public static class answer extends Structure {
                    public static class ByReference extends answer implements Structure.ByReference {}
                    
              public int  TType      = 0;                   
              public int  Amount     = 0;        
              public byte Rcode[]    = new byte[3]; //выход: 
              public byte AMessage[] = new byte[16]; //выход: 
              public int  CType      = 0;         //выход: 
              public PointerByReference Check;         //выход: 
              protected List getFieldOrder() {
                      return Arrays.asList(new String[] {"TType", "Amount", "Rcode","AMessage", "CType","Check"});
              }
        }
        public int my_function(byte track2[], answer.ByReference ans);
  }

  public static void Start() {
      My_Dll test_dll = (My_Dll) Native.loadLibrary("my_dll", My_Dll.class);
      My_Dll.answer.ByReference aa = new My_Dll.answer.ByReference();
      // определяем In
      aa.Amount = 100;
      aa.TType =3;

      int result = test_dll.my_function(null,aa);
      // выводим OUT
      System.out.println("Result: "  + result);
      System.out.println("Rcode: "  + new String(aa.Rcode));
      System.out.println("Amessage: " + new String(aa.AMessage));
      
      Pointer p =  aa.Check.getValue();// на этой строчке возникает ошибка
}



Сама функция dll точно работает и заполняет значения параметров OUT, так как на другом языке програмирования я получаю нужные значения. В параметре Check возвращается ссылка на область памяти, из который потом достаю текст.
...
Рейтинг: 0 / 0
27.06.2013, 17:24:00
    #38313096
dirt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNA возращаем char*
Маппинг типов некорректный. Вообще char* соответствует String-у.
https://jna.java.net/nonav/javadoc/overview-summary.html#marshalling

(И PointerByReference перед употреблением необходимо инициализировать)
...
Рейтинг: 0 / 0
27.06.2013, 17:57:12
    #38313155
LeoArslan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNA возращаем char*
>Вообще char* соответствует String-у
Именно с этого описания и начал, и стал пробовать со String, но в этом случае ошибка возникает еще раньше на этапе вызова функции:
Код: java
1.
  int result = test_dll.my_function(null,aa);
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / JNA возращаем char* / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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