[英]how to use library of native camera for android ndk?
我嘗試加載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
您似乎正在使用完整的Android源代碼樹進行構建,因此,我假設您正在為特定的Android設備編寫應用程序。 如果不是,請不要這樣做-libcamera_client不是任何公共API或NDK的一部分,因此使用它非常脆弱。 由於該庫是一個實現細節,因此各個Android供應商都可以隨意對其進行修改或替換,並且在以后的Android版本中它可能會消失/更改。
除此之外,完整的Android構建已經包含該庫,因此您只需要引用它即可。 完全刪除PREBUILD_SHARED_LIBRARY部分,這不是必需的。 然后嘗試將以下內容添加到您的測試規則中:
LOCAL_SHARED_LIBRARIES := libcamera_client
LOCAL_C_INCLUDES := frameworks/av/include
另外,為什么要構建共享庫作為最終產品而不是可執行文件? 除非您為測試程序遺漏了最終的構建規則,否則這可能是錯誤的。
否, LOCAL_EXPORT_C_INCLUDES
將不會創建文件夾。 您應該將此make
變量指向AOSP樹的本地副本中的include
目錄,例如從https://android.googlesource.com/platform/frameworks/av/+/master/include/中 。
您可能需要更多的包含目錄,以提供C ++預處理程序將要查找的所有其他文件,例如cutils
, utils
等。
無論如何,對於libcamera_cient.so
使用$(PREBUILT_SHARED_LIBRARY)
是不正確的。 這將導致將此共享庫與APK一起部署到您安裝此APK的任何設備上。 您的APK中不需要此文件:任何設備上的/system/lib
目錄中都應該有libcamera_client.so
。 不僅如此,您還想使用該庫的設備相關版本,而不是您要部署的版本。 幸運的是,系統加載程序將首選該庫的系統版本,而忽略您部署的副本。
您應該在Android.mk
使用的標志是LOCAL_LDLIBS
。 在NDK的最新發行版中,使用-lcamera_client
將觸發警告,因為NDK希望只有NDK正式提供的公共庫才能通過這種方式鏈接。
關於using namespace android
,一旦預編譯器找到camera/Camera.h
文件,此錯誤消息就會消失。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.