【问题标题】:how to use library of native camera for android ndk?如何为android ndk使用本机相机库?
【发布时间】:2014-04-04 09:49:10
【问题描述】:

我尝试加载 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 并将包含目录 (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

【问题讨论】:

    标签: android c++ android-ndk shared-libraries static-libraries


    【解决方案1】:

    看起来您正在使用完整的 Android 源代码树进行构建,因此我假设您正在为特定的 Android 设备编写应用程序。如果您不是,请不要这样做 - libcamera_client 不是任何公共 API 或 NDK 的一部分,因此使用它非常脆弱。由于该库是一个实现细节,因此各个 Android 供应商可能会随意修改或替换它,并且它可能会在未来的 Android 版本中消失/更改。

    除此之外,完整的 Android 版本已经包含该库,因此您只需引用它即可。完全删除 PREBUILD_SHARED_LIBRARY 部分,不需要它。 然后尝试将以下内容添加到您的测试规则中:

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

    另外,您为什么要构建共享库作为最终产品,而不是可执行文件?这可能是错误的,除非您遗漏了测试程序的最终构建规则。

    【讨论】:

      【解决方案2】:

      不,LOCAL_EXPORT_C_INCLUDES 不会创建文件夹。您应该将此 make 变量指向 AOSP 树的本地副本中的 include 目录,例如来自https://android.googlesource.com/platform/frameworks/av/+/master/include/

      您可能需要更多包含目录来提供 C++ 预处理器将要查找的所有额外文件,例如cutilsutils

      无论如何,将$(PREBUILT_SHARED_LIBRARY) 用于libcamera_cient.so 是不正确的。这将导致将此共享库与您的 APK 一起部署到您安装此 APK 的任何设备上。您的 APK 中不需要此文件:任何设备上的 /system/lib 目录中都应该有 libcamera_client.so。不仅如此,您还想使用这个库的设备相关版本,而不是您部署的那个。幸运的是,系统加载器会更喜欢这个库的系统版本,并忽略您部署的副本。

      您应该在Android.mk 中使用的标志是LOCAL_LDLIBS。在最近发布的 NDK 中,使用 -lcamera_client 会触发警告,因为 NDK 只希望以这种方式链接官方提供的 NDK 的公共库。

      关于using namespace android,一旦预编译器找到camera/Camera.h文件,这个错误信息就会消失。

      【讨论】:

      • 能否提供这个项目64位('arm64-v8a'版本)的.so文件?它只包含 32 位 .so 文件。请帮我。 github.com/alexcohn/native-camera2
      • @BhunnuBaba:我不建议在 POC 之外使用这个库。它不适用于 API>23。此外,为 arm64 构建它将是完全独立的工作,因为它使用平台源和标头。
      猜你喜欢
      • 1970-01-01
      • 2013-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      • 2012-06-21
      相关资源
      最近更新 更多