Проблема с отображением структуры C на Java с использованием Java Native Access. ⇐ 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 его нет.
У меня есть следующий фрагмент заголовка 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 его нет.
Мобильная версия