powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JNA - как работать с Pointer?
3 сообщений из 3, страница 1 из 1
JNA - как работать с Pointer?
    #39494153
eml78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь работать с библиотекой GFL из Java.
Там есть структура GFL_BITMAP
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
typedef struct {
		GFL_BITMAP_TYPE  Type; 
		GFL_ORIGIN       Origin; 
		GFL_INT32        Width; 
		GFL_INT32        Height; 
		GFL_UINT32       BytesPerLine; 
		GFL_INT16        LinePadding; 
		GFL_UINT16       BitsPerComponent;  /* 1, 8, 10, 12, 16 */
		GFL_UINT16       ComponentsPerPixel;/* 1, 3, 4  */
		GFL_UINT16       BytesPerPixel;     /* Only valid for 8 or more bits */
		GFL_UINT16       Xdpi; 
		GFL_UINT16       Ydpi; 
		GFL_INT16        TransparentIndex;  /* -1 if not used */
		GFL_INT16	       Reserved; 
		GFL_INT32        ColorUsed; 
		GFL_COLORMAP*    ColorMap; 
		GFL_UINT8*       Data; 
		char*            Comment; 
		void*            MetaData; 

		GFL_INT32        XOffset; 
		GFL_INT32        YOffset; 
		char*            Name; 
	} GFL_BITMAP; 


Я ее описал на 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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
    public static class GFL_BITMAP extends Structure {

        public short type; //GFL_BITMAP_TYPE
        public short origin; //GFL_ORIGIN
        public int width; //GFL_INT32
        public int height; //GFL_INT32
        public int bytesPerLine; //GFL_UINT32
        public short linePadding; //GFL_INT16
        public short bitsPerComponent; //GFL_UINT16 (1, 8, 10, 12, 16)
        public short componentsPerPixel; //GFL_UINT16 (1, 3, 4)
        public short bytesPerPixel; //GFL_UINT16 (nly valid for 8 or more bits)
        public short xdpi; //GFL_UINT16
        public short ydpi; //GFL_UINT16
        public short transparentIndex; //GFL_INT16 (-1 if not used)
        public short reserved; //GFL_INT16
        public int colorUsed; //GFL_INT32
        public GFL_COLORMAP colorMap = new GFL_COLORMAP.ByReference(); //GFL_COLORMAP*
        public Pointer data; //GFL_UINT8*
        public String comment; //char*
        public Pointer metaData; //void*
        public int xOffset; //GFL_INT32
        public int yOffset; //GFL_INT32
        public String name; //char*

        @Override
        protected List<String> getFieldOrder() {
            return Arrays.asList(
                    "type",
                    "origin",
                    "width",
                    "height",
                    "bytesPerLine",
                    "linePadding",
                    "bitsPerComponent",
                    "componentsPerPixel",
                    "bytesPerPixel",
                    "xdpi",
                    "ydpi",
                    "transparentIndex",
                    "reserved",
                    "colorUsed",
                    "colorMap",
                    "data",
                    "comment",
                    "metaData",
                    "xOffset",
                    "yOffset",
                    "name");
        }

        public static class ByReference extends GFL_BITMAP implements Structure.ByReference {
        };
    }


И есть метод gflLoadBitmap
Код: plaintext
1.
extern GFLEXTERN GFL_ERROR GFLAPI gflLoadBitmap( const char* filename, GFL_BITMAP** bitmap, const GFL_LOAD_PARAMS* params, GFL_FILE_INFORMATION* info );


Который на Java я описал так
Код: java
1.
short gflLoadBitmap(String filename, GFL_BITMAP.ByReference[] bitmap, GFL_LOAD_PARAMS params, GFL_FILE_INFORMATION info);


для библиотеки GFL - я создал интерфейс Gfl (где и описаны методы и структуры).
При вызове метода gflLoadBitmap - ошибки вроде нет (возвращается 0). Размер картинки тоже вроде правильно определяет (height/width). Но поле data остается null - может быть нужно его как-то изначально проинициализировать? Но вроде как память под данные должна GFL выделять, т.е. я размер заранее не знаю...
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
        Gfl.GFL_LOAD_PARAMS params = new Gfl.GFL_LOAD_PARAMS.ByReference();
        Gfl.GFL_FILE_INFORMATION info = new Gfl.GFL_FILE_INFORMATION.ByReference();
        gfl.gflGetDefaultLoadParams(params);
        Gfl.GFL_BITMAP.ByReference[] b = new Gfl.GFL_BITMAP.ByReference[]{new Gfl.GFL_BITMAP.ByReference()};        
	short error = gfl.gflLoadBitmap("d:\\Zoom3a.jpg", b, params, info);
        System.out.println(error);
        Gfl.GFL_BITMAP.ByReference bitmap = b[0];
        System.out.println(bitmap.height);


Подскажите пожалуйста что я делаю не так?
...
Рейтинг: 0 / 0
JNA - как работать с Pointer?
    #39494375
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
eml78,

Код: java
1.
Pointer mem = new Memory(height * width);

может так поможет?
...
Рейтинг: 0 / 0
JNA - как работать с Pointer?
    #39495162
eml78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Глобальная проблема была в том что я наследовался от Library, а надо было от StdCallLibrary.

Кроме того, вместо:
Код: java
1.
public GFL_COLORMAP colorMap = new GFL_COLORMAP.ByReference(); //GFL_COLORMAP*

надо было писать
Код: java
1.
public GFL_COLORMAP.ByReference colorMap; //GFL_COLORMAP*



Последнее что мне пока не нравиться - и от чего я не знаю как избавиться, это
Код: java
1.
Gfl.GFL_BITMAP.ByReference[] b = new Gfl.GFL_BITMAP.ByReference[]{new Gfl.GFL_BITMAP.ByReference()};  


Дело в том, что структура new Gfl.GFL_BITMAP.ByReference() - не нужна, т.к. она создается при выходе из функции gflLoadBitmap - т.е. до вызова и после в b[0] лежат разные объекты.
Но если сделать так
Код: java
1.
Gfl.GFL_BITMAP.ByReference[] b = new Gfl.GFL_BITMAP.ByReference[1];  

- то будет NullPointerException

Да и вообще вариант с передачей GFL_BITMAP** как массива из одного элемента GFL_BITMAP.ByReference[] - выглядит криво.
Можно еще сделать так
Код: java
1.
short gflLoadBitmap(String filename, PointerByReference bitmap, GFL_LOAD_PARAMS params, GFL_FILE_INFORMATION info);

Но тогда теряется информация о типе и придется вручную разбирать структуру ответа
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JNA - как работать с Pointer?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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