JNA Pointer извлекает значение - PullRequest
3 голосов
/ 15 июня 2011

Я использую JNA для доступа к DLL, и все работает нормально ... пока я нахожусь в отладке !!!

Проблема в том, когда я запускаю свой код Java в режиме без отладки.

Цель dll - вызываться путем передачи параметров somme в строку и заполнения указателя char с результатом.

Поэтому для получения результата в java я использую объект PointerByReference.Когда я нахожусь в отладке, нет никакой проблемы, я получаю правильный результат, но в моем стандартном процессе есть только один символ в моем результате.

Это мой вызов Java:

PointerByReference EXMES = new PointerByReference();
PointerByReference SCHAINE = new PointerByReference();
DoubleByReference dateDujour = new DoubleByReference(DATEJOUR);

log.debug(String.format("Appel avec les arguments : ECHAINE=[%s]; DATEJOUR=[%s]", echaine, sdf.format(dateEngagement)));

Map<String, Object> options = new HashMap<String, Object>();
options.put(Library.OPTION_TYPE_MAPPER, W32APITypeMapper.ASCII);

log.error(String.format("Default Charset : [%s]", Charset.defaultCharset().displayName()));
Native.setProtected(true);
MyNativeLibrary library = (MyNativeLibrary) Native.loadLibrary("myLib", MyNativeLibrary.class, options);
library = (MyNativeLibrary) Native.synchronizedLibrary(library);

String chaineAscii = new String("DATE_NAISSANCE\n19780102\nMEDIA\n4\n".getBytes(Charset.forName("US-ASCII")));

log.error(String.format("ECHAINE [%s]", chaineAscii));

library.SATINTS(chaineAscii, SCHAINE, dateDujour, EXMES);

String chaineSortie = new String(SCHAINE.getPointer().getString(0, false).getBytes(Charset.forName("US-ASCII")));
String chaineExmes = new String(EXMES.getPointer().getString(0, false).getBytes(Charset.forName("US-ASCII")));

log.debug(String.format("Retour taille Prexis : SCHAINE=[%d]; EXMES=[%d]", chaineSortie.length(), chaineExmes.length()));
log.debug(String.format("Retour Prexis : SCHAINE=[%s]; EXMES=[%s]", chaineSortie, chaineExmes));

Вот выдержка из моей функции C:

#define PRX_ALPHA char
#define EALPHA PRX_ALPHA *
#define SALPHA PRX_ALPHA *

EALPHA CHAINE;
SALPHA SCHAINE;
EDATE DATEJOUR;
SALPHA EXMES;

int winapi myFunction(
CHAINE,
SCHAINE,
DATEJOUR,
EXMES
) {


// Do something with the CHAINE and DATEJOUR then fill SCHAINE and EXMES with an answer
to my call

Спасибо за каждую помощь, я застрял

1 Ответ

7 голосов
/ 01 июля 2011

PointerByReference эквивалентно void ** в C. Это не соответствует вашему прототипу нативной функции.

String эквивалентно const char*. Любые изменения, сделанные вашим собственным кодом в памяти, на которую указывает этот аргумент, будут игнорироваться. Если вы хотите предоставить свой собственный код в качестве буфера для заполнения, используйте byte[] или Memory.

Memory.getString(0) или Native.toString(byte[]) можно затем использовать для создания Java String из результата вместо вашего довольно многословного String конструктора.

...