我试图加载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
答案 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 ++预处理器将要查找的所有额外文件,例如: cutils
,utils
等
无论如何,对$(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
文件,此错误消息就会消失。