Проблема с отображением структуры C на Java с использованием Java Native Access.JAVA

Программисты JAVA общаются здесь
Ответить
Гость
 Проблема с отображением структуры C на Java с использованием Java Native Access.

Сообщение Гость »


У меня есть следующий фрагмент заголовка C из проекта, который я хотел бы сопоставить с Java с помощью JNA:

... typedef size_t ObjectHandle; typedef const char *FfiStr; typedef struct FfiList_FfiStr { size_t счетчик; const FfiStr *данные; } FfiList_FfiStr; typedef структура FfiList_FfiStr FfiStrList; int create_schema (FfiStr имя_схемы, FfiStr версия_схемы, FfiStr идентификатор эмитента, FfiStrList attr_names, ObjectHandle *result_p); ... Я не могу найти правильное сопоставление с Java для типов FfiStr и FfiStrList.

Вот сопоставление, которое я пробовал в Java:

публичный интерфейс CredLibrary расширяет библиотеку { CredLibrary INSTANCE = (CredLibrary) Native.load("credlibrary", CredLibrary.class); общественный класс FfiStr расширяет структуру { публичный класс ByReference расширяет FfiStr реализует Structure.ByReference {}; общедоступная строка FfiStr; общественный FfiStr () { FfiStr = новая строка (); } общественный FfiStr (String s) { FfiStr = новая строка(ы); } @Override защищенный список getFieldOrder() { return Arrays.asList("FfiStr"); } } общественный класс FfiList_FfiStr расширяет структуру { общедоступный счетчик Size_t; общедоступные данные FfiStr.ByReference[]; общественный FfiList_FfiStr (String [] attr) { супер(); count = новый Size_t(attr.length); данные = новый FfiStr.ByReference[attr.length]; } @Override защищенный список getFieldOrder() { return Arrays.asList("count", "data"); } } int create_link_secret (PointerByReference link_secret_p); intgenerate_nonce(PointerByReference nonce_p); int create_schema (имя_схемы FfiStr, версия_схемы FfiStr, идентификатор эмитента FfiStr, FfiList_FfiStr attr_names, IntByReference result_p); } Первые функции create_link_secret иgenerate_nonce работают нормально, create_schema не работает.

А вот тест, который я попробовал:

CredLibrary.FfiStr имя_схемы = new CredLibrary.FfiStr("test"); CredLibrary.FfiStr схема_версия = новая CredLibrary.FfiStr("v1"); CredLibrary.FfiStr Issuer_id =новый CredLibrary.FfiStr("123"); CredLibrary.FfiList_FfiStr атрибут = новый CredLibrary.FfiList_FfiStr (attr); IntByReference pref3 = новый IntByReference(); int c = lib.anoncreds_create_schema(schema_name,schema_version,issuer_id,attrib,pref3); int p3 =pref3.getValue(); Log.i("TEST","Значение созданной схемы:"+String.valueOf(c)); Если быть точнее, create_schema выводит 1, который является значением ErrorCode для проблем, связанных с входными значениями. Вероятно, это означает, что мое сопоставление структур из C в Java неверно. Значит, я, вероятно, делаю что-то не так в коде сопоставления Java.

Можно ли указать, что я делаю не так?

Я подумал, что, возможно, FfiStr ошибается, поскольку у Java FfiStr есть атрибут, а у C его нет.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»