如何使用原生相机库为Android ndk?

时间:2014-04-04 09:49:10

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

我试图加载libcamera_client.so但我遇到了问题。根据我的Android.mk,它应该创建一个名为&#34; include&#34;的文件夹。有了相机库,对吗?但它没有创建文件夹,我看不到它。当我使用#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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

不,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中不需要此文件:任何设备上的libcamera_client.so目录中都应该有/system/lib。更重要的是,您希望使用此库的设备相关版本,而不是您部署的版本。幸运的是,系统加载器将更喜欢该库的系统版本,并忽略您部署的副本。

您希望在Android.mk中使用的标记为LOCAL_LDLIBS。在最近发布的NDK版本中,使用-lcamera_client会触发警告,因为NDK预计只有正式提供NDK的公共库才能以这种方式链接。

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