簡體   English   中英

如何為Android NDK使用本機相機庫?

[英]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 ++預處理程序將要查找的所有其他文件,例如cutilsutils等。

無論如何,對於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM