Android Studio JNI: не может скомпилировать c-библиотеку JPEG - PullRequest
0 голосов
/ 02 сентября 2018

Моя программа должна читать изображения в формате jpeg из файла native. Для этого я скачал официальный исходный код jpeglib c, который безупречно работает в версии этой программы для Windows, которая запрограммирована с использованием Embarcadero RAD Studio 8.

Но когда я пытаюсь использовать один и тот же исходный код в Android Studio JNI, я вижу множество ошибок почти в каждом файле c-source :( Ниже приведен скриншот:

Screenshot

Как видите, на обоих

есть ошибки

- Расширения Макро (ERREXIT, подчеркнуты красным), которые жалуются на то, что «класс« бла »не имеет поля« бла ».

Методы-члены (красный текст в коде), которые также жалуются на то, что «класс« бла-бла »не имеет поля« бла-бла »».

Похоже, что есть много классов и полей на языке C, или, вероятно, все, которые не работают. Но источник jpeglib определенно содержит их все, что-то просто не работает в Android Studio! Возможно, C-компилятор Android Studio каким-то образом ограничен, но должен быть какой-то способ его обойти ...

Эта проблема не существует в исходных файлах C ++. У меня есть разные исходные папки для исходных файлов java и C ++ (и есть также отдельная папка jni, но я не использую ее, вероятно, я должен), но исходные файлы C находятся внутри папки C ++. Я добавил все исходные файлы c, cpp, h и hpp в круглые скобки директивы add_library () CMakeLists.txt, но это все. Я не знаю, достаточно ли этого ...

Я рад получить любые предложения, как это исправить.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Ну, кажется, счастливый конец ...

Я должен признать, что Android Studio, скорее всего, может компилировать c-библиотеку JPEG :) Проблема "класса" blahblah "не имеет поля" blahblah "" заключалась в том, что библиотеку необходимо настроить для конкретного набора инструментов, как сказал @Алекс Кон. Но конфигурация не происходит в CMakeLists.txt, вместо этого вам нужно переписать сам код в некоторой степени. Например, вам нужно изменить

-INT32 до int32_t

- # определить логическое значение bool

- # определить EXTERN extern

-добавить много #include <> и #include ""

-и еще ...

Если вам нужно сделать это, начните с файлов заголовков: не трогайте файлы C, пока у вас не будет ошибок в заголовках. Как примечание, у меня был точно такой же порядок сборки в Android Studio, как и в Embarcadero Studio, но это не помогло добиться успеха ... Я пока не знаю, сработает ли эта измененная библиотека, но, по крайней мере, я думаю я избавлюсь от ошибок компиляции!

0 голосов
/ 03 сентября 2018

Недостаточно добавить все libjpeg файлы к вашему add_library(). Предполагается, что библиотека будет настроена для конкретной цепочки инструментов, см., Например, это пример .

Я предпочитаю оптимизированную версию библиотеки, которая называется libjpeg-turbo . На GitHub вы можете найти пошаговые инструкции по кросс-компиляции библиотеки для Android.

...