Как использовать библиотеку родной камеры для Android ndk?

0

Я попытался загрузить libcamera_client.so, но у меня проблемы. Согласно моему Android.mk, он должен создать папку с именем "include" с библиотеками камер, верно?. Но он не создает папку, я не вижу ее. Когда я использую #include <camera/Camera.h> и using namespace android; Я вижу:

fatal error: camera/Camera.h: No such file or directory

error: 'android' is not a namespace-name

Кто-нибудь, может мне помочь?

Заранее спасибо.

Мой Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := camera_client-prebuild
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libcamera_client.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_SRC_FILES := test.cpp
LOCAL_SHARED_LIBRARIES := camera_client-prebuild
LOCAL_LDLIBS := -llog -ldl -lm 

include $(BUILD_SHARED_LIBRARY)

ОБНОВЛЕНИЕ 1:

Я пытаюсь написать приложение для определенного устройства Android, которое использует камеру с собственным кодом. Я взял скомпилированные библиотеки (libcamera_client.so) с моего устройства, и я хочу загрузить функции камеры.

Я попытался написать LOCAL_LDLIBS := -llog -ldl -lm -lcamera_client и скопировать каталог include (https://android.googlesource.com/platform/frameworks/av/+/android-4.1.2_r2.1/include) внутри локальной папки jni. Но когда я компилирую, я вижу jni/camera/Camera.h:20:26: fatal error: utils/Timers.h: No such file or directory, проблема в том, что camera.h зависит от других библиотек, которые я не копировал в моем местном проекте. Когда я удаляю строку:

#include <camera/Camera.h>

Я вижу:

arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lcamera_client

Более того, я изменил свой код:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_SRC_FILES := test.c
LOCAL_LDLIBS := -llog -ldl -lm
LOCAL_SHARED_LIBRARIES := libcamera_client
LOCAL_C_INCLUDE := frameworks/av/include
include $(BUILD_SHARED_LIBRARY)

но проблема остается, что зависит от других библиотек, которых у меня нет в моем локальном проекте

jni/camera/Camera.h:20:26: fatal error: utils/Timers.h: No such file or directory
Теги:
static-libraries
android-ndk
shared-libraries

2 ответа

1

Похоже, вы используете полное исходное дерево Android для создания, поэтому я собираюсь предположить, что вы пишете приложение для определенного устройства Android. Если вы этого не сделаете, не делайте этого - libcamera_client не является частью какого-либо публичного API или NDK, поэтому использование его очень хрупкое. Поскольку библиотека представляет собой детальную реализацию, отдельные производители Android могут изменять или заменять ее по своему усмотрению, и она может исчезнуть/измениться в будущей версии Android.

В целом, полная сборка Android уже включает в себя эту библиотеку, поэтому вам просто нужно ссылаться на нее. Удалите раздел PREBUILD_SHARED_LIBRARY полностью, он не нужен. Затем попробуйте добавить следующие правила тестирования:

LOCAL_SHARED_LIBRARIES := libcamera_client
LOCAL_C_INCLUDES := frameworks/av/include

Кроме того, почему вы создаете общую библиотеку как конечный продукт, а не исполняемый файл? Вероятно, это неправильно, если только вы не оставляете окончательные правила сборки для тестовой программы.

0

Нет, LOCAL_EXPORT_C_INCLUDES не будет создавать папки. Вы должны указать эту переменную make в каталог include из вашей локальной копии дерева AOSP, например, https://android.googlesource.com/platform/frameworks/av/+/master/include/.

Вы, вероятно, нужно больше включать в себя каталоги, чтобы предоставить все дополнительные файлы, которые C++ препроцессор будет искать, например, cutils, utils и т.д.

Во всяком случае, использование $(PREBUILT_SHARED_LIBRARY) для libcamera_cient.so неверно. Это приведет к развертыванию этой общей библиотеки с вашим APK на любом устройстве, которое вы устанавливаете APK. Вам не нужен этот файл в APK: на любом устройстве должен быть libcamera_client.so in /system/lib. Более того, вы хотите использовать зависящую от устройства версию этой библиотеки, а не ту, которую вы развертываете. К счастью, системный загрузчик предпочтет системную версию этой библиотеки и проигнорирует развернутую копию.

Флаг, который вы собираетесь использовать в Android.mk - LOCAL_LDLIBS. С недавними выпусками NDK использование -lcamera_client вызовет предупреждение, потому что NDK ожидает, что только связанные с ним NDK публичные библиотеки будут связаны таким образом.

Что касается using namespace android, это сообщение об ошибке исчезнет, как только прекомпилятор найдет файл camera/Camera.h.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню